在 Python 中,特殊名称__main__
被用于两个重要的构造:
-
程序的最高层级环境的名称,可以使用
__name__ == '__main__'
表达式来检查它;以及 -
Python 包中的
__main__.py
文件。
这两种机制都有 Python 模块有关;用户如何与它们交互以及它们之间如何交互。 下文将进行详细说明。 如果你还不了解 Python 模块,请查看教程 模块 一节的介绍。
__name__ == '__main__'
当一个 Python 模块或包被导入时,__name__
会被设为模块的名称。 通常,这将是 Python 文件本身的名称去掉 .py 后缀:
>>>
>>> import configparser
>>> configparser.__name__
'configparser'
如果文件是包的组成部分,则 __name__
还将包括父包的路径:
>>>
>>> from concurrent.futures import process
>>> process.__name__
'concurrent.futures.process'
不过,如果模块是在最高层级代码环境中执行的,则它的 __name__
会被设为字符串 '__main__
'。
什么是“最高层级代码环境”?
__main__
是最高层级代码运行所在环境的名称。 “最高层级代码”即用户指定最先启动运行的 Python 模块。 它被称为“最高层级”是因为它将导入程序所需的所有其他模块。 有时“最高层级代码”也被称为应用的 入口点。
最高层级代码环境可以是:
- 一个交互提示符的作用域:
>>>
>>> __name__
'__main__'
- 作为文件参数传给 Python 解释器的 Python 模块:
$ python3 helloworld.py
Hello, world!
- 作为 -m 参数传给 Python 解释器的 Python 模块或包:
$ python3 -m tarfile
usage: tarfile.py [-h] [-v] (...)
- Python 解释器从标准输入中读取的 Python 代码:
$ echo "import this" | python3
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
...
- 作为 -c 参数传递给 Python 解释器的 Python 代码:
$ python3 -c "import this"
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
...
在以上每个情形中,顶级模块的
__name__
被设置为 '__main__
'
因此,一个模块可以通过检查自己的 __name__
,来发现它是否在顶层环境中运行。这是允许在模块没有从导入语句中初始化的情况下,有条件地执行代码的一个常见的语句:
if __name__ == '__main__':
# Execute when the module is not initialized from an import statement.
...
这就是 if __name__ == '__main__'
代码块的用武之地。除非模块在顶层环境中被执行,否则该块内的代码不会运行。