这个问题很简单,但不能通过搜索来回答。如何在python脚本中确定此脚本是作为模块导入还是作为脚本运行?python有什么不同吗?
问题是,我只想在作为脚本运行的情况下评估命令行参数,而不是在导入模块以便在另一个脚本中使用它时进行评估。(我希望能够同时使用一个脚本作为库和程序。)恐怕最好的方法是构建lib和使用它的第二个脚本,但我希望对于小型工具/lib有第二个选择。
发布于 2009-09-07 11:59:19
来自python docs
使用运行Python模块时的
python fibo.py
模块中的代码将被执行,就像您导入它一样,但__name__
设置为"__main__"
。这意味着通过在模块的末尾添加以下代码:
if __name__ == '__main__':
# Running as a script
您可以将该文件用作脚本和可导入的模块,因为解析命令行的代码仅在该模块作为“主”文件执行时才会运行
发布于 2019-09-17 23:22:31
正如@bobince所指出的:
如果您是由
python -m somemodule
调用的模块,则您也将是__main__
假设您有一个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
解决方案1:使用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
解决方案2:在模块导入时使用try-except块
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
https://stackoverflow.com/questions/1389044
复制相似问题