Python:if __name__ == '__main__'的詳細解析


經常碰到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等於那個你在命令行輸入的程序名。 這個東西的好處就是,別人調用時(你並非是主程序入口)后面的東西不運行,自己命令行執行時(你是主程序入口)后面的東西運行。故可以作為測試用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM