對於剛接觸python的初學者來說,經常會發現一些python代碼文件最後會有這麼一段
if __name__ == '__main__' :
main()
....
那麼這句話是什麼意思呢?
有句話經典的概括了這段代碼的含義: “Make a script both importable and executable”
意思就是說讓你寫的腳本模塊既可以導入到別的模塊中用,另外該模塊自己也可執行。這句話,可能一開始聽的還不是很懂。
通俗的理解__name__ == '__main__':
假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明');
在你自己眼中,你是你自己(__name__ == '__main__')。
if __name__ == '__main__'的意思是:
當.py文件被直接運行時,if __name__ == '__main__'之下的代碼塊將被運行;
當.py文件以模塊形式被導入時,if __name__ == '__main__'之下的代碼塊不被運行。
下面我們舉例來說明。
先寫一個模塊(或者說第一個.py文件)
# first.py
def main():
print('we are in %s' % __name__)
if __name__ == '__main__':
main()
print('-----------ending---------')
直接運行first.py文件,運行結果是:
we are in __main__
-----------ending---------
通過運行結果,我們可以分析出:
當我們直接運行first.py文件,__name__的值就是 __main__。也就是上文所說的“在你自己眼中,你就是你自己”
然後我們再寫另一個模塊(或者說另一個.py文件)
# second.py
from first import main # 將first.py文件以模塊形式導入sencond.py文件
main() # 調用first.py文件中的main方法
我們運行second.py文件,運行結果是:
we are in first
通過運行結果,我們可以分析出:
一、當我們將first.py文件以模塊形式導入sencond.py文件,__name__的值就是 first。也就是上文所說的“在你朋友(second)的眼中,你是你(first)”
二、我們發現 first.py文件中的if語句之後的代碼沒有被運行,因爲此時的__name__是first,而不是__main__。
總結:
如果我們是直接執行某個.py文件的時候,該文件中那麼”__name__ == '__main__'“是True,但如果我們從另外一個.py文件通過import導入該文件的時候,這時__name__的值就是我們這個py文件的名字而不是__main__。
這個功能還有一個用處:調試代碼的時候,在”if __name__ == '__main__'“中加入一些我們的調試代碼,我們可以讓外部模塊調用的時候不執行我們的調試代碼,但是如果我們想排查問題的時候,直接執行該模塊文件,調試代碼能夠正常運行!