從這篇博文可以對__main__屬性有一個直觀的了解块差。
即__name__與__main__解決了.py文件自己運(yùn)行與被當(dāng)做模塊被導(dǎo)入運(yùn)行的區(qū)別。
下面舉個例子倔丈,假設(shè)目錄如下:
——main_test
——a
——__init__.py
——b
——__init__.py
——c.py
——const.py
——test.py
const.py文件為
# coding=utf-8
# 變量函數(shù)依然可以作為模塊導(dǎo)入到其他模塊使用
PI = 3.14
def main():
print("execute const.py as a "+__name__+" module")
#作為主程序入口執(zhí)行
if __name__ == "__main__":
main()
#作為模塊執(zhí)行以下代碼
else:
print("the module name is "+__name__)
test.py文件為
if __name__ == "__main__":
print("the module name is "+__name__)
或者為
from const import PI
print(PI)
運(yùn)行test.py憨闰,即將test.py文件作為主程序入口,則結(jié)果為
the module name is __main__
或者
the module name is const
3.14
這里想要說明一點需五,不管是from module import item
還是import module
鹉动,都會執(zhí)行該module的主(main)程序,除非在該主程序上加上if __name__ == "__main__"
,即module不再作為主程序運(yùn)行宏邮。
綜上泽示,我們可以說
一個Python源碼文件(.py)除了可以被直接運(yùn)行外,還可以作為模塊(也就是庫)蜜氨,被其他.py文件導(dǎo)入械筛。不管是直接運(yùn)行還是被導(dǎo)入,.py文件的最頂層代碼都會被運(yùn)行(Python用縮進(jìn)來區(qū)分代碼層次)飒炎,而當(dāng)一個.py文件作為模塊被導(dǎo)入時埋哟,我們可能不希望一部分代碼被運(yùn)行。
現(xiàn)在我們將test.py文件改為
import a.b.c
c.py程序為
import math
if __name__ == "__main__":
print("This is a main Entrance")
else:
print(__name__)
執(zhí)行test.py郎汪,可得
a.b.c
這里可以說明c.py文件是當(dāng)做模塊導(dǎo)入赤赊,而且它的__name__屬性充分體現(xiàn)了它的包的層次闯狱。另外,也說明了以上一點:只要import一個module抛计,它就會執(zhí)行該module的主程序哄孤。
如果不是執(zhí)行test.py,而是執(zhí)行c.py吹截,則結(jié)果為
#這是個主程序入口
This is a main Entrance
現(xiàn)在再來看一下目錄
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
則執(zhí)行Chapter 1.py則會打印出PCV
這說明了__init__.py相當(dāng)于是PCV(package)的主程序入口录豺,只要import PCV(package),就會執(zhí)行
if __name__ == "name of package"
下的代碼。
總結(jié)
- __name__與__main__解決了.py文件自己運(yùn)行與被當(dāng)做模塊被導(dǎo)入運(yùn)行的區(qū)別
- 不管是from module import item還是import module饭弓,都會執(zhí)行該module的主(main)程序双饥,除非在該主程序上加上
if __name__ == "__main__"
,即module不再作為主程序運(yùn)行,而是作為模塊執(zhí)行 - 只要
from package1 import package2
或import package2
弟断,就會執(zhí)行package1和package2目錄下的__init__.py文件的主程序(main)咏花,__init__.py文件里的__name__分別就是package1和package1.package2(包名)