經常碰到if __name__ == '__main__':
不明白它是什么作用,今天上網查了資料,這篇文章寫得很好,謝分享這篇文章的大哥,小弟我笑納了。
轉載大哥的,網址:https://www.cnblogs.com/kumata/p/8963199.html
Python:if __name__ == '__main__'
簡介:
__name__是當前模塊名,當模塊被直接運行時模塊名為_main_,也就是當前的模塊,當模塊被導入時,模塊名就不是__main__,即代碼將不會執行。
關於代碼if __name__ == '__main__': 下面舉幾個例子解釋下:
先編寫一個測試模塊add1.py
#!/usr/bin/env python3 # -*- coding: utf-8 -*- ' a test module ' def addFunc(a,b): return a+b print('add1計算結果:',addFunc(1,1))
再編寫一個模塊add2.py來調用上面的模塊:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- ' a test module ' import add1 print('調用add1模塊執行的結果是:',add1.addFunc(12,23))
在剛才兩個模塊的路徑(我的路徑為:“C:\work”)中打開cmd,用命令行運行add1.py:
C:\work>python add1.py
add1計算結果: 2
在剛才兩個模塊的路徑中打開,用命令行運行add2.py:
C:\work>python add2.py
add2計算結果: 2 調用add1模塊執行的結果是:35 #顯然,當我運行add2.py后第一句並不是調用者所需要的,為了解決這一問題,Python提供了一個系統變量:__name__ #注:name兩邊各有2個下划線__name__有2個取值:當模塊是被調用執行的,取值為模塊的名字;當模塊是直接執行的,則該變量取值為:__main__
於是乎,被調用模塊的測試代碼就可以寫在if語句里了,如下:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- ' a test module ' def addFunc(a,b): return a+b if __name__ == '__main__': print('add1計算結果:',addFunc(1,1))
當再次運行add1.py:
C:\work>python add1.py
add1計算結果: 2
#結果並沒有改變,因為調用add1.py時,__name__取值為__main__,if判斷為真,所以就輸出上面的結果
當再次運行add2.py:
C:\work>python add2.py
調用test模塊執行的結果是: 35
#此時我們就得到了預期結果,不輸出多余的結果。能實現這一點的主要原因在於當調用一個module時,此時的__name__取值為模塊的名字,所以if判斷為假,不執行后續代碼。
所以代碼iif __name__ == '__main__': 實現的功能就是Make a script both importable and executable,也就是說可以讓模塊既可以導入到別的模塊中用,另外該模塊自己也可執行。
學過c語言的話,可以知道C語言定義主程序入口就是main()函數,main代表了程序主入口,即和系統的接口(說白了就是命令行直接調用)。if name == 'main': 這句話的核心無非就是在判斷該程序文件是否作為主程序入口罷了。 如果在命令行直接調用該程序文件,該文件作為主程序入口,name == 'main'理所當然啊。 如果在命令行調用其他程序文件,主程序入口name == 'main'自然不成立,因為main等於那個你在命令行輸入的程序名。 這個東西的好處就是,別人調用時(你並非是主程序入口)后面的東西不運行,自己命令行執行時(你是主程序入口)后面的東西運行。故可以作為測試用。