从这篇博文可以对__main__属性有一个直观的了解。
即__name__与__main__解决了.py文件自己运行与被当做模块被导入运行的区别。
下面举个例子,假设目录如下:
——main_test
——a
——__init__.py
——b
——__init__.py
——c.py
——const.py
——test.py
const.py文件为
# coding=utf-8
# 变量函数依然可以作为模块导入到其他模块使用
PI = 3.14
def main():
print("execute const.py as a "+__name__+" module")
#作为主程序入口执行
if __name__ == "__main__":
main()
#作为模块执行以下代码
else:
print("the module name is "+__name__)
test.py文件为
if __name__ == "__main__":
print("the module name is "+__name__)
或者为
from const import PI
print(PI)
运行test.py,即将test.py文件作为主程序入口,则结果为
the module name is __main__
或者
the module name is const
3.14
这里想要说明一点,不管是from module import item
还是import module
,都会执行该module的主(main)程序,除非在该主程序上加上if __name__ == "__main__"
,即module不再作为主程序运行。
综上,我们可以说
一个Python源码文件(.py)除了可以被直接运行外,还可以作为模块(也就是库),被其他.py文件导入。不管是直接运行还是被导入,.py文件的最顶层代码都会被运行(Python用缩进来区分代码层次),而当一个.py文件作为模块被导入时,我们可能不希望一部分代码被运行。
现在我们将test.py文件改为
import a.b.c
c.py程序为
import math
if __name__ == "__main__":
print("This is a main Entrance")
else:
print(__name__)
执行test.py,可得
a.b.c
这里可以说明c.py文件是当做模块导入,而且它的__name__属性充分体现了它的包的层次。另外,也说明了以上一点:只要import一个module,它就会执行该module的主程序。
如果不是执行test.py,而是执行c.py,则结果为
#这是个主程序入口
This is a main Entrance
现在再来看一下目录
PCV
——__init__.py
——tools
——__init__.py
——graphcut.py
——imregistration.py
——imtools.py
——localdescriptors
——__init__.py
——dsift.py
——harris.py
——geometry
——camera.py
——warp.py
在PCV目录下的__init__.py改为
if __name__ == "__main__":
print("execute init.py as a main procedure")
else:
print(__name__)
在Chapter 1.py里写入import PCV
则执行Chapter 1.py则会打印出PCV
这说明了__init__.py相当于是PCV(package)的主程序入口,只要import PCV(package),就会执行
if __name__ == "name of package"
下的代码。
总结
- __name__与__main__解决了.py文件自己运行与被当做模块被导入运行的区别
- 不管是from module import item还是import module,都会执行该module的主(main)程序,除非在该主程序上加上
if __name__ == "__main__"
,即module不再作为主程序运行,而是作为模块执行 - 只要
from package1 import package2
或import package2
,就会执行package1和package2目录下的__init__.py文件的主程序(main),__init__.py文件里的__name__分别就是package1和package1.package2(包名)