if __name__ == '__main__': 的簡要說明:
每個python模塊或python文件(如下圖中的 hello1.py文件,python模塊和python文件的區別在於--python文件有.py后綴)都包含內置的變量 __name__,而__main__始終指當前執行的文件或當前路徑。當該文件被直接執行的時候,__name__ 等於文件名即等於__main__,而此時__name__將會被解析器自動賦值為"__main__",為字符串類型(注意__name__的值不會被賦值為tt.hello1.py,見圖1),從而使表達式 if __name__=="__main__" 為真。接下來看圖2,如果模塊(即tt.hello1)被 import 到其他模塊中,則該模塊的 __name__ 等於模塊名稱(不包含后綴.py),即此時__name__的值為tt.hello1,見圖2。
一個python文件通常有兩種使用方法,第一是作為腳本直接執行,第二是 import 到其他的 python 腳本中被調用(模塊重用)執行。因此 if __name__ == '__main__': 的作用就是控制這兩種情況執行代碼的過程。如圖1,圖2,在 if __name__ == '__main__': 下的代碼只有在第一種情況下(即文件作為腳本直接執行)才會被執行,而 import 到其他腳本中是不會被執行的(因為此時的__name__=tt.hello1,表達式 if __name__=="__main__" 為假)。
接下來分析為什么會報錯ModuleNotFoundError: No module named '__main__.base'; '__main__' is not a package,如圖3
圖中使用了相對路徑,發現導入失敗,.hello1 即當前路徑下的hello1模塊
此時的 .hello1被解析成__main__.hello ,從而導致程序運行失敗,使用絕對路徑即可