问题相当简单,但没有通过搜索得到回答.如何在python脚本中确定此脚本是作为模块导入还是作为脚本运行?在python中有什么不同吗?
问题是,我只想在作为脚本运行时评估命令行参数,但是如果仅导入模块以在另一个脚本中使用它,则不会.(我希望能够使用一个脚本作为库和程序.)我担心vanilla的方式是构建lib和使用它的第二个脚本,但是我想为小工具提供第二个选项. /库.
Nad*_*mli 40
来自python docs:
当你运行Python模块时
python fibo.py
将执行模块中的代码,就像您导入它一样,但
__name__设置为"__main__".这意味着通过在模块的末尾添加此代码:
if __name__ == '__main__':
# Running as a script
Run Code Online (Sandbox Code Playgroud)
您可以使该文件可用作脚本以及可导入模块,因为解析命令行的代码仅在模块作为"主"文件执行时运行
正如@bobince 所指出的:
\n\n\n\n\n\n
__main__如果你是一个被调用的模块,你也会是python -m somemodule
假设您有一个 Python 文件bar.py和一个空文件__init__.py,都位于名为 的文件夹中foo:
$ tree\n.\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 foo\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bar.py\n\n$ cat foo/__init__.py\nRun Code Online (Sandbox Code Playgroud)\n\n下面的Python代码块是foo/bar.py.
__name__(不工作)print(\'Code executed as a %s\' % \'script\' if __name__ == \'__main__\' else \'module\')\nRun Code Online (Sandbox Code Playgroud)\n\n这将产生:
\n\n$ python foo/bar.py\nCode executed as a script\n\n$ python -m foo.bar\nCode executed as a script\nRun Code Online (Sandbox Code Playgroud)\n\nvars()和sys.modulesimport sys\nmod_name = vars(sys.modules[__name__])[\'__package__\']\nprint(\'Code executed as a \' + (\'module named %s\' % mod_name if mod_name else \'script\'))\nRun Code Online (Sandbox Code Playgroud)\n\n这将产生:
\n\n$ python foo/bar.py\nCode executed as a module named foo\n\n$ python -m foo.bar\nCode executed as a script\nRun Code Online (Sandbox Code Playgroud)\n\nimport sys\ntry:\n import foo\n print(\'Code executed as a module\')\nexcept ImportError:\n print(\'Code executed as a script\')\n # Code will fail here, but you can still print a comprehensive error message before exiting:\n print(\'Usage: python -m foo.bar\')\n sys.exit()\nRun Code Online (Sandbox Code Playgroud)\n\n这将产生:
\n\n$ python foo/bar.py\nCode executed as a module\n\n$ python -m foo.bar\nCode executed as a script\nUsage: python -m foo.bar\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
6801 次 |
| 最近记录: |