天天看點

if __name__ == __main___終于搞懂了Python腳本裡的if __name__ == '__main__'

經常在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()函數被運作,結果如下:

if __name__ == __main___終于搞懂了Python腳本裡的if __name__ == &amp;#39;__main__&amp;#39;

第二步:直接執行main_test.py,my_fun()函數沒有被運作,結果如下:

if __name__ == __main___終于搞懂了Python腳本裡的if __name__ == &amp;#39;__main__&amp;#39;

由此可以看出,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()函數:

if __name__ == __main___終于搞懂了Python腳本裡的if __name__ == &amp;#39;__main__&amp;#39;

第四步:再次執行main_test.py,結果如下:

if __name__ == __main___終于搞懂了Python腳本裡的if __name__ == &amp;#39;__main__&amp;#39;

可以看到在import print_array時,print_array.py中的my_fun()函數同時被運作了。

總結

通過以上幾個步驟,可以看出if __name__ == '__main__' 在腳本中起到的作用。

子產品作為腳本獨立執行時,__name__ == '__main__'的結果為True,if中的語句會被運作。

子產品作為被其他腳本調用的子子產品時,腳本檔案中的__name__ == '__main__'的結果為False,if中的語句不會被運作。

是以,如果子產品不存在被調用的場景,這句話可以省略。如果存在被調用的場景,那麼是必不可少的。