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

时间:2009-09-07 11:58:18

标签: python module

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

问题是,我只想在作为脚本运行时评估命令行参数,但是如果仅导入模块以在另一个脚本中使用它,则不会。 (我希望能够使用一个脚本作为库和程序。)我担心vanilla的方式是构建lib和使用它的第二个脚本,但是我想为小工具提供第二个选项。 /库。

2 个答案:

答案 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

解决方案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