使用python編寫自己的程序時,都會用到 __init__.py 和 __main__ 這兩個代碼模塊,,有關(guān) __init__ 的相關(guān)內(nèi)容可以閱讀文章《python 代碼中 __init__ 是什么用途,?》,本文重點講述有關(guān)__main__的用法,。事實上,,python代碼中導(dǎo)入某個程序模塊或工具包,一般都默認(rèn)使用 __init__.py程序查詢需要導(dǎo)入的程序或工具包,。假定有以下兩種情況: 組織在一起的許多python程序文件,,作為程序模塊一次性導(dǎo)入; 單一文件結(jié)構(gòu)的多個python程序文件,,在命令提示符下直接運行,; 第一種情況下,就需要把組織在一起的多個程序文件,,作為一個模塊導(dǎo)入,,這就要用到 __init__.py;對于第二種情況,可以使用如下代碼: def main (): pass if __name__ == '__main__': main() 這種方法類似C++或Java等其他語言中的 程序入口,,也就是程序執(zhí)行的起始點,,但這種辦法沒有通用性,并不理想,,那么就可以使用 __main__.py,。下面看一個組織多個python程序文件的示例,文件組織結(jié)構(gòu)如下圖: 上圖中的 “src” 可以作為一個模塊,,在其他 python 程序中加上“src”所在的路徑就可以整體一次性導(dǎo)入,。但是如果要在命令提示符下運行類似這種多個文件組織在一起的模塊,就需要把__main__.py文件添加進(jìn)去,,文件組織結(jié)構(gòu)如下圖所示: 其中,,__main__.py包括以下類似的內(nèi)容:print('____請選擇 _____') print('1: 求正方形的面積 \n\ 2: 求矩形的面積\n\ 3: 求圓形的面積') ch = int(input()) if ch == 1: from src.square import square print('輸入正方形的邊長:') s = int(input()) print ('正方形的面接為:', square(s)) if ch == 2: from src.rectangle import rectangle print('輸入矩形的長度和寬度:') l = int(input()) b = int(input()) print('矩形的面積為:', rectangle(l, b)) if ch == 3: from src.circle import circle print('輸入圓的半徑') r = int(input()) print('圓形的面積為: ', circle(r)) 如以上代碼這樣,編寫 __main__.py ,,就可以在命令提示符或終端輸入以下命令,,來運行“src” 中的 程序文件。運行時的終端輸出如下圖所示: 上圖給出了在命令提示符下,,運行 area-finder.py 程序包,,python 就查找 __main__.py 文件并且自動運行,如果找不到__main__.py文件,,就會給出報錯信息,,并運行main.py。以上代碼只是為了理解“src” 程序包和 __main__.py 之間的關(guān)系以及 _main__.py的運行機(jī)制,,可以看出,,使用 __main__.py 有兩個優(yōu)點,既避免了 python執(zhí)行程序時入口不明確的弊端,,又有助于清晰地執(zhí)行“src”中的程序文件,,這對于較大的python項目來說很重要。 最后順便說一下,,python 程序中 if __name__ == “__main__”: 的用途,。 python 在執(zhí)行源代碼文件之前,解釋器先讀入源代碼文件,,并定義幾個專用的變量或全局變量,。如果python解釋器把該源代碼作為主程序,那么就會設(shè)定 __name__ 變量的值為 “__main__”,;如果要運行的程序需要從其他程序模塊導(dǎo)入,,那么 __name__ 變量的值就設(shè)置為目標(biāo)程序模塊的名稱,該模塊名稱對于__name__這個全局變量來說是有效的,,這樣的程序模塊是一個代碼文件,,包括定義和說明,,文件擴(kuò)展名也是.py??纯聪旅孢@段示例代碼,,名稱為script.py : # Python 程序直接執(zhí)行 __main__print ('總是執(zhí)行__main__') if __name__ == '__main__': print ('直接調(diào)用時執(zhí)行__main__')else: print ('導(dǎo)入時執(zhí)行__main__') 以上代碼文件中,,未縮進(jìn)的語句都會被執(zhí)行,,但只進(jìn)行函數(shù)和類的定義,并不運行代碼,,其中 __name__變量的值是 __main__,;對于縮進(jìn)的語句,只運行入口模塊,,可以看出哪一句是直接執(zhí)行的,,哪一句是導(dǎo)入后再執(zhí)行的,如果是導(dǎo)入執(zhí)行的,,那__name_變量的值就是要執(zhí)行的程序模塊的名稱,。看看下面的示例代碼:# Python 程序直接運行函數(shù)def my_function(): print ('I am inside function') # 測試函數(shù)調(diào)用my_function() 如果使用的模塊需要導(dǎo)入,,代碼可以寫成如下: #先導(dǎo)入要調(diào)用的函數(shù),,再運行if __name__ == '__main__': my_function() import myscript myscript.my_function() 通過前面的講述和示例代碼,可以簡單地了解 if __name__ == '__main__': 的用途,。一般來講,,每個python程序模塊都有 __name__ 變量及其設(shè)定值,如果設(shè)定值為 __main__,,就意味著該模塊可以單獨執(zhí)行,;如果該程序模塊在另一個程序模塊內(nèi),那__name__ 的值就要設(shè)定為目標(biāo)程序模塊的名稱,;if __name__ == 'main': 只能用于直接執(zhí)行代碼塊的某一部分代碼,,而不是導(dǎo)入相關(guān)代碼來執(zhí)行。 (本文完) |
|