經常在Python腳本的最後看到有這樣的語句:
if __name__ == '__main__': main()
那麼這是什麼意思呢?
__name__是什麼?
__name__是目前子產品(腳本檔案)的一個屬性,當直接運作目前腳本時,__name__的值是'__main__'。
而當目前子產品(腳本檔案)被其他腳本import時,它的__name__屬性的值為子產品名。
舉個例子:
腳本檔案1:print_array.py
腳本檔案1定義了一個名為my_fun()的函數。
#!/usr/bin/env python#-*- coding:utf-8 -*-import numpy as npdef my_fun(): n = input("Input a single positive odd integer greater than 2: ") while True: try: n = int(n) if (int(n) % 2 == 0 or int(n) < 2): n = input("Oops, you have given a WRONG number! Please input a single positive odd integer greater than 2: ") else: break except: n = input("Oops, you have given a WRONG number! Please input a single positive odd integer greater than 2: ") print ("n = %s" %n) a = np.zeros((n, n), dtype=int) m = n // 2 a[:, m] = 1 a[m, :] = 1 print (a)def main(): my_fun()if __name__ == '__main__': main()
腳本檔案2:main_test.py
腳本檔案2對腳本檔案1進行了調用。
#!/usr/bin/env python#-*- coding:utf-8 -*-import print_arrayprint (print_array.__name__)print (__name__)
開始測試:
第一步:直接執行print_array.py,my_fun()函數被運作,結果如下:
第二步:直接執行main_test.py,my_fun()函數沒有被運作,結果如下:
由此可以看出,print_array.py中增加了對__name__屬性的判斷後,在被main_test.py調用時,不會運作my_fun()函數。
同時,在執行main_test.py時,pring_array的__name__屬性的值為'print_array',而main_test.py本身的__name__屬性值為'__main__'。
第三步:對print_array.py作一些修改,去掉對__name__屬性的判斷,改為直接運作my_fun()函數:
第四步:再次執行main_test.py,結果如下:
可以看到在import print_array時,print_array.py中的my_fun()函數同時被運作了。
總結
通過以上幾個步驟,可以看出if __name__ == '__main__' 在腳本中起到的作用。
子產品作為腳本獨立執行時,__name__ == '__main__'的結果為True,if中的語句會被運作。
子產品作為被其他腳本調用的子子產品時,腳本檔案中的__name__ == '__main__'的結果為False,if中的語句不會被運作。
是以,如果子產品不存在被調用的場景,這句話可以省略。如果存在被調用的場景,那麼是必不可少的。