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

Don*_*ohe 25 python module

问题相当简单,但没有通过搜索得到回答.如何在python脚本中确定此脚本是作为模块导入还是作为脚本运行?在python中有什么不同吗?

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

Nad*_*mli 40

来自python docs:

当你运行Python模块时

python fibo.py

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

if __name__ == '__main__':
    # Running as a script
Run Code Online (Sandbox Code Playgroud)

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

  • 这看起来有点神奇,但实际上是一个完全标准的习语.如果你是'python -m somemodule'调用的模块,你也将是\ _\_ _ main _ _\_. (4认同)

roi*_*ere 5

正如@bobince 所指出的:

\n\n
\n

__main__如果你是一个被调用的模块,你也会是python -m somemodule

\n
\n\n

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

\n\n
$ tree\n.\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 foo\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bar.py\n\n$ cat foo/__init__.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

使用__name__(不工作)

\n\n
print(\'Code executed as a %s\' % \'script\' if __name__ == \'__main__\' else \'module\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将产生:

\n\n
$ python foo/bar.py\nCode executed as a script\n\n$ python -m foo.bar\nCode executed as a script\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
import sys\nmod_name = vars(sys.modules[__name__])[\'__package__\']\nprint(\'Code executed as a \' + (\'module named %s\' % mod_name if mod_name else \'script\'))\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将产生:

\n\n
$ python foo/bar.py\nCode executed as a module named foo\n\n$ python -m foo.bar\nCode executed as a script\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
import sys\ntry:\n    import foo\n    print(\'Code executed as a module\')\nexcept ImportError:\n    print(\'Code executed as a script\')\n    # Code will fail here, but you can still print a comprehensive error message before exiting:\n    print(\'Usage: python -m foo.bar\')\n    sys.exit()\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将产生:

\n\n
$ python foo/bar.py\nCode executed as a module\n\n$ python -m foo.bar\nCode executed as a script\nUsage: python -m foo.bar\n
Run Code Online (Sandbox Code Playgroud)\n