这个问题相当简单,但没有通过搜索来回答。如何在python脚本中确定此脚本是作为模块导入还是作为脚本运行?在python中有什么区别吗?
问题是,我只想在作为脚本运行时评估命令行参数,但是如果仅导入模块以在另一个脚本中使用它,则不会。 (我希望能够使用一个脚本作为库和程序。)我担心vanilla的方式是构建lib和使用它的第二个脚本,但是我想为小工具提供第二个选项。 /库。
答案 0 :(得分:38)
来自python docs:
使用
运行Python模块时python fibo.py
模块中的代码将是 执行,就像你导入它一样, 但
__name__
设置为"__main__"
。这意味着通过添加 这个代码在你的模块的最后:
if __name__ == '__main__':
# Running as a script
您可以将文件用作脚本以及可导入模块,因为解析命令行的代码仅在模块作为“主”文件执行时运行
答案 1 :(得分:1)
@bobince指出:
如果您是
__main__
调用的模块,那么您也将是python -m somemodule
假设您有一个Python文件bar.py
和一个空的__init__.py
,它们都位于一个名为foo
的文件夹中:
$ tree
.
└── foo
├── __init__.py
└── bar.py
$ cat foo/__init__.py
下面的Python代码块是foo/bar.py
的内容。
__name__
(不起作用)print('Code executed as a %s' % 'script' if __name__ == '__main__' else 'module')
这将产生:
$ python foo/bar.py
Code executed as a script
$ python -m foo.bar
Code executed as a script
vars()
和sys.modules
import sys
mod_name = vars(sys.modules[__name__])['__package__']
print('Code executed as a ' + ('module named %s' % mod_name if mod_name else 'script'))
这将产生:
$ python foo/bar.py
Code executed as a module named foo
$ python -m foo.bar
Code executed as a script
import sys
try:
import foo
print('Code executed as a module')
except ImportError:
print('Code executed as a script')
# Code will fail here, but you can still print a comprehensive error message before exiting:
print('Usage: python -m foo.bar')
sys.exit()
这将产生:
$ python foo/bar.py
Code executed as a module
$ python -m foo.bar
Code executed as a script
Usage: python -m foo.bar