繁体   English   中英

如何确定python脚本是作为模块导入还是作为脚本运行?

[英]how do I determine whether a python script is imported as module or run as script?

这个问题很简单,但没有通过搜索回答。 如何在python脚本中确定此脚本是作为模块导入还是作为脚本运行? python有什么区别吗?

问题是,仅当作为脚本运行时,我才想评估命令行参数,如果仅导入模块以在另一个脚本中使用它,则不希望。 (我希望能够将一个脚本同时用作库和程序。)恐怕最有效的方法是建立lib和使用该脚本的第二个脚本,但是我想为小型工具提供第二个选择/ libs。

来自python docs

当您使用以下命令运行Python模块时

python fibo.py

该模块中的代码将被执行,就像您导入它一样,但是__name__设置为"__main__" 这意味着通过在模块末尾添加以下代码:

if __name__ == '__main__':
    # Running as a script

您可以将文件用作脚本以及可导入的模块,因为解析命令行的代码仅在将模块作为“主”文件执行时才运行

正如@bobince指出的:

如果您是python -m somemodule调用的__main__那么您也将成为__main__

假设您在名为foo的文件夹中都有一个Python文件bar.py和一个空的__init__.py

$ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM