首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何确定python脚本是作为模块导入还是作为脚本运行?

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

Stack Overflow用户
提问于 2009-09-07 11:58:18
回答 2查看 11K关注 0票数 35

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

问题是,我只想在作为脚本运行的情况下评估命令行参数,而不是在导入模块以便在另一个脚本中使用它时进行评估。(我希望能够同时使用一个脚本作为库和程序。)恐怕最好的方法是构建lib和使用它的第二个脚本,但我希望对于小型工具/lib有第二个选择。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-07 11:59:19

来自python docs

使用运行Python模块时的

python fibo.py

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

代码语言:javascript
复制
if __name__ == '__main__':
    # Running as a script

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

票数 50
EN

Stack Overflow用户

发布于 2019-09-17 23:22:31

正如@bobince所指出的:

如果您是由python -m somemodule调用的模块,则您也将是__main__

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

代码语言:javascript
复制
$ tree
.
└── foo
    ├── __init__.py
    └── bar.py

$ cat foo/__init__.py

下面的Python代码块是foo/bar.py的内容。

使用__name__ (不工作)

代码语言:javascript
复制
print('Code executed as a %s' % 'script' if __name__ == '__main__' else 'module')

这将产生:

代码语言:javascript
复制
$ python foo/bar.py
Code executed as a script

$ python -m foo.bar
Code executed as a script

解决方案1:使用vars()sys.modules

代码语言:javascript
复制
import sys
mod_name = vars(sys.modules[__name__])['__package__']
print('Code executed as a ' + ('module named %s' % mod_name if mod_name else 'script'))

这将产生:

代码语言:javascript
复制
$ python foo/bar.py
Code executed as a module named foo

$ python -m foo.bar
Code executed as a script

解决方案2:在模块导入时使用try-except块

代码语言:javascript
复制
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()

这将产生:

代码语言:javascript
复制
$ python foo/bar.py
Code executed as a module

$ python -m foo.bar
Code executed as a script
Usage: python -m foo.bar
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1389044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档