可执行文件
每一个 .py
文件模块,都是 Python 的可执行文件。文件内容可以为空,但执行什么也不发生。
你可以在某些编辑工具里打开文件执行,也可以在命令行使用 python 文件路径
或 python -m 模块
的方式执行。这些方式都是主模块中直接执行文件。
主模块(你正在运行代码的当前模块)的 __name__
属性总是 '__main__'
(__main__
是一个在解释器启动时直接初始化的特殊模块),因此直接执行文件,if __name__ == '__main__':
语句下的代码一定会被执行,而如果导入到其他模块则不会。
__name__
'__main__'
下面举例说明:
当前文件路径下,有一个 myfile
的包,包里有 space.py
和 mycode.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模块中的代码
我是导入其他模块不会执行的代码