在Python模塊當中,通常會寫上一行「if __name__==』__main__:」作為程序的入口,但似乎沒有這麼一行代碼,程序也能正常運行。那麼這句代碼多餘嗎?為什麼?本篇對此進行介紹。
Python模塊通常有兩種運行方式,第一種作為腳本直接運行,第二種是被導入( import )到其他的 Python 模塊中。if __name__==』__main__: 的作用就是控制這兩種情況代碼執行過程,在if __name__==』__main__: 下的代碼只有在第一種情況下才會被執行,而 import 到其他腳本中是不會被執行的,下面我們通過實例詳細介紹說明。
直接運行模塊
如下,直接執行p_testops.py模塊 ,我們可以看到if __name__==』__main__: 語句之前和之後的代碼都被執行。
導入(import)到其他模塊
如下,只輸出了print testops.format_time()的運行結果。即,if __name__==』__main__:之前的語句被執行,之後的沒有被執行。
if __name__ == '__main__':運行原理
既然是個 if 判斷語句,我們就來看看__name__ 。
__name__是標識模塊的名字的一個系統變量,上面例子中提到的n_testops.py、p_testops.py就是兩個模塊,我們在文中開頭提到模塊運行分兩種情況,如下。
直接運行模塊
假如當前模塊是主模塊(執行運行),那麼此模塊名字就是__main__,通過if判斷__name__==』__main__結果為真,這樣就可以執行if __name__ == '__main__'後面的代碼。示例代碼如下:
如下,可以看到p_testops.py被直接運行時,__name__的值為__main__,那麼__name__=="__main__"為真,執行了print testops.str_time()。
導入(import)到其他模塊
假如此模塊是被導入(import)的,則此模塊名字為文件名字(不含後綴),通過if判斷__name__=="__main__"為假,這樣就會跳過if __name__ == '__main__':後面的代碼。示例代碼如下:
如下,我們可以看到 p_testops.py模塊被導入到n_testops.py模塊中,__name__的值為p_testops,__name__=="__main__"為假,跳過if __name__ == '__main__':後面的代碼。