主程序入口__main__

2019-09-29  本文已影响0人  28fd90f2ac9b

从这篇博文可以对__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"

下的代码。

总结

上一篇 下一篇

猜你喜欢

热点阅读