可执行文件

每一个 .py 文件模块,都是 Python 的可执行文件。文件内容可以为空,但执行什么也不发生。

你可以在某些编辑工具里打开文件执行,也可以在命令行使用 python 文件路径python -m 模块 的方式执行。这些方式都是主模块中直接执行文件。

主模块(你正在运行代码的当前模块)的 __name__ 属性总是 '__main__'__main__ 是一个在解释器启动时直接初始化的特殊模块),因此直接执行文件,if __name__ == '__main__': 语句下的代码一定会被执行,而如果导入到其他模块则不会。

__name__
'__main__'

下面举例说明:

当前文件路径下,有一个 myfile 的包,包里有 space.pymycode.py 模块,内容如下:

# space.py 为空
# mycode.py 的内容, 在此源码直接执行
_a = '自学'

def __f():
    print(_a)

msg1 = '我是mycode模块中的代码'
print(msg1)

if __name__ == '__main__':
    msg2 = '我是导入其他模块不会执行的代码'
    print(msg2)
我是mycode模块中的代码
我是导入其他模块不会执行的代码
# 导入不会执行 __name__ == '__main__' 下面的代码
from myfile import mycode
print(mycode.msg1)
mycode.msg2
我是mycode模块中的代码
我是mycode模块中的代码


---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

~\AppData\Local\Temp/ipykernel_21344/86150704.py in <module>
      2 from myfile import mycode
      3 print(mycode.msg1)
----> 4 mycode.msg2


AttributeError: module 'myfile.mycode' has no attribute 'msg2'

命令行直接执行模块效果同上。下面使用命令执行(%run 是 jupyter 的魔法命令,终端请改为 python):

# 文件路径必须带 .py,可以是相对或绝对路径
%run myfile/space.py 
%run myfile/mycode.py
我是mycode模块中的代码
我是导入其他模块不会执行的代码
import warnings # 忽略警告
warnings.filterwarnings("ignore") 

# 模块可以使用属性表示法,但不能有 .py
%run -m myfile.mycode 
我是mycode模块中的代码
我是导入其他模块不会执行的代码