一篇文章徹底弄懂Python中的if?__name__?==?__main__
1. 引言
在Python相關代碼中,我們經(jīng)常會遇到如下代碼段:
# stuff if __name__ == "__main__": # do stuff
本文將盡可能使用簡單的樣例來解釋這里發(fā)生了什么,以及需要使用if __name__=="__main__"
的情形。請注意,上述代碼中name
和main
前后有2個下劃線字符。
閑話少說,我們直接開始吧!
2. 特殊變量
當我們正常運行我們的Python
腳本時,該腳本中的變量__name__
的值一般為__main__
。我們來看個示例:
# first.py print(__name__)
我們在終端中運行上述腳本,代碼如下:
python first.py
輸出如下:
__main__
觀察上述輸出,當我們運行腳本first.py
的時候,變量__name__
的值被設置為__main__
。
3. 復雜的例子
上述示例相對簡單,也相對容易理解。接著我們來舉個具有多個文件的例子,這里假設我們有三個腳本,分別為a.py
,b.py
以及c.py
。
其中,a.py
的內容如下:
# a.py print("__name__ in a.py:", __name__) from b import * from c import *
此時,b.py
的內容如下:
# b.py print("__name__ in b.py:", __name__)
c.py
的內容如下:
# c.py print("__name__ in c.py:", __name__)
如果我們運行命令python a.py
得到結果如下:
__name__ in a.py: __main__
__name__ in b.py: b
__name__ in c.py: c
注意在腳本a.py
中我們看到__name__
的值為__main__
,此時在腳本b.py
中__name__
的值為b
, 同時 c.py
中__name__
的值為c
。這是因為我們運行的腳本為a.py
,那么該腳本即a.py
中變量__name__
的值將會被設置為字符串__main__
.
此外,腳本b.py
和c.py
中的變量·__name__
分別保持為b
和c
,這是因為腳本b.py
和c.py
不是直接運行的腳本。而是我們運行的腳本a.py
調用了b.py
和c.py
中的print
函數(shù)。
如果我們單獨運行python b.py
得到結果如下:
__name__ in b.py: __main__
相應的我們運行python c.py
,得到結果如下:
__name__ in c.py: __main__
觀察上述兩個輸出,當我們直接運行腳本b.py
或c.py
,相應的腳本里的變量__name__
都將被設置為__main__
。
4. 使用場景
作為Python開發(fā)者,我們通常會在一個項目工程中創(chuàng)建多個Python
文件而不是將所有代碼都寫在一個Python
文件中。因此我們通常會有一個主的Python
文件用來作為項目工程的入口,同時其他文件包含一些輔助性的函數(shù)實現(xiàn)。
我們來看個示例,這里假設我們有兩個Python
文件,如下:
# main.py from helper import * print(greet("bob"))
輔助函數(shù)實現(xiàn) helper.py
內容如下:
# helper.py def greet(name): return "hello " + name print(greet("testname"))
如果此時我們運行命令 python main.py
,得到結果如下:
hello bob
hello testname
主要上述的import
語句將從helper.py
中引入所有的語句,所以helper.py
中的測試語句print(greet("testname"))
也將被執(zhí)行。雖然我們可以通過添加注釋或者屏蔽注釋來達到運行main.py
或helper.py
來控制該測試語句的輸出,但是這種情形就是語句if __name__=="__main__"
大顯身手的情形。
5. 解決方案
我們針對上述情形,進行代碼整改,如下:
# main.py from helper import * print(greet("bob"))
我們修改文件 helper.py
內容如下:
def greet(name): return "hello " + name if __name__ == "__main__": print(greet("testname"))
此時,我們執(zhí)行命令python main.py
,得到結果如下:
hello bob
注意,此時helper.py
中的變量 __name__
的值為helper
, 所以helper.py
中的if
語句不成立,進而將不會執(zhí)行我們的測試語句print(greet("testname"))
.
此時,如果我們單獨運行命令python helper.py
,得到結果如下:
hello testname
單獨運行helper.py
時,此時改腳本中的變量__name__
將被設置為__main__
,所以此時的測試語句將會被執(zhí)行,輸出相應的測試結果。
6. 總結
本文重點介紹了Python中常見的if __name__=="__main__"
,重點分析了其背后的原理和應用的場景。
到此這篇關于Python中if __name__ == __main__的文章就介紹到這了,更多相關Python中if __name__ == __main__內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
pandas.dataframe中根據(jù)條件獲取元素所在的位置方法(索引)
今天小編就為大家分享一篇pandas.dataframe中根據(jù)條件獲取元素所在的位置方法(索引),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06python初學者,用python實現(xiàn)基本的學生管理系統(tǒng)(python3)代碼實例
這篇文章主要介紹了用python實現(xiàn)學生管理系統(tǒng),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04Pycharm中Python環(huán)境配置常見問題解析
這篇文章主要介紹了Pycharm中Python環(huán)境配置常見問題,結合圖文形式分析了Pycharm中Python環(huán)境配置模塊路徑問題、虛擬環(huán)境創(chuàng)建、配置遠程服務器、連接數(shù)據(jù)庫等常見問題與操作方法,需要的朋友可以參考下2020-01-01