Python中if name == 'main':的作用和原理
abstract:
參見我的語雀: https://www.yuque.com/jhongtao/zr9a1x/hyqgqk.
python 中name = ‘main’ 的作用,到底是幹嘛的?
有句話經典的概括了這段代碼的意義:“Make a script both importable and executable”
一個python文件通常有兩種使用方法,第一是作爲腳本直接執行,第二是 import 到其他的 python 腳本中被調用(模塊重用)執行。
因此 if name == ‘main’: 的作用就是控制這兩種情況執行代碼的過程,在 if name == ‘main’: 下的代碼只有在直接作爲腳本直接執行時纔會被執行,而 import 到其他腳本中是不會被執行的
if name == ‘main’:的運行原理
name
每個python模塊(python文件,也就是此處的 one.py 和 two.py)都包含內置的變量 name,當該模塊被直接執行的時候,name**** 的值等於當前模塊的文件名(包含後綴 .py );如果該模塊 import 到其他模塊中,則該模塊的 name 值等於模塊名稱(不包含後綴.py)****。
** **'main’
而** ’main’ 始終指當前執行模塊的文件名稱(包含後綴.py)。進而當模塊被直接執行時,name == ’main’ **** 結果爲true;當模塊被import到其它模塊時****,__name__的值爲模塊名稱(不包括文件後綴.py),’main’的值還是模塊文件全稱(包含文件後綴.py),所以此時****name**** == ****'main’的結果就爲false,因此if name == ‘main’**後面的代碼不會被執行。
案例說明
one.py模塊:
# one.py
# 在one模塊中使用if __name__ == '__main__':
# 此時one.py模塊的'__main__'的是one.py;__name__的值也是one.py,也就是'__main__'的值
print("__name__.value:" ,__name__)
print ("this is one")
if __name__ == '__main__':
print("process one main")
two.py模塊:
# two.py
# 引入one.py模塊
# 當模塊one.py模塊被引入到two.py模塊時:
# one.py模塊的__name__的值爲:one (沒有文件擴展名)
# one.py木塊的'__main__'的值還視爲:one.py (有文件擴展名)
import one
執行:one.py
直接執行 one.py,結果如圖,__name__的值爲:可以成功 print 兩行字符串。即,if name==“main”: 語句之前和之後的代碼都被執行。
執行:two.py
執行 import_test.py 腳本,**__name__的值爲:one,**只輸出了第一行字符串。即,if name==“main”: 之前的語句被執行,之後的沒有被執行。
總結一下:
這個功能還有一個用處:調試代碼的時候,在”if name=="main“中加入一些我們的調試代碼,我們可以讓外部模塊調用的時候不執行我們的調試代碼,但是如果我們想排查問題的時候,直接執行該模塊文件,調試代碼能夠正常運行!