Python - if __name__ == '__main__' 是什麼?

Python - if __name__ == '__main__'  是什麼?


 

 

如果只有一頁,沒有什麼影響

page1.py

#page1.py

def myfn1():
    print("1.hello");
    
print("1.hi");

myfn1();


如果是其它網頁,例如page2.py要引入page1.py

page2.py

#page2.py

from page1 import myfn1

print("2.hi");

myfn1();


主程式在被引用的時候也被執行了,原因在於:

  1. 當 Python 檔案(模組、module)被引用的時候,檔案內的每一行都會被 Python 直譯器讀取並執行(所以 page1.py內的程式碼會被執行)
  2. Python 直譯器執行程式碼時,有一些內建、隱含的變數,__name__就是其中之一,其意義是「模組名稱」。如果該檔案是被引用,其值會是模組名稱;
  3. 但若該檔案是(透過命令列)直接執行,其值會是 __main__

可試著在 page1.py 內加上 __name __ 印出看看 ,  值的名稱會為__main__

#page1.py

def myfn1():
    print("1.hello");
    
print("1.hi");

myfn1();

print("name=",__name__);


再執行page2.py

這裡的name會改成page1


你就可以看到 __name__ 的值在檔案被直接執行時與被引用時是不同的。所以回到上面的問題:

要怎麼讓檔案在被引用時,不該執行的程式碼不被執行?

就是靠 __name__ == '__main__'來做判斷

只有當__name__是主檔(__main)才會執行 #如果是被引入的就不會執行


page1.py

#page1.py

def myfn1():
    print("1.hello");

if __name__ == '__main__':    
    print("1.hi");
    myfn1();

這時候就只有page1.py 自己執行時,會被執行

page1.py

page2.py


 

 

參考:http://blog.castman.net/%E6%95%99%E5%AD%B8/2018/01/27/python-name-main.html

Yiru@Studio - 關於我 - 意如