原因
用python編寫了一個工程,但在第一次運行后,發現工程根目錄下生成了一個__pycache__
文件夾,發現文件夾里面是和py文件同名的各種以 .cpython-35.pyc
結尾的文件。
模塊的調用
Python中導入模塊時,實際上會把被導入的模塊執行一遍,如下:
先看被調用的模塊test.py:
1 def funny(): 2 print("有趣") 3
4 funny()
再看主程序main.py:
1 import test 2
3 print("你好")
執行結果是:
1 有趣
2 你好
那怎么才能只是單純調用而不執行被調用模塊的代碼呢?要想被調用模塊代碼不被執行,前提得知道變量__name__是什么意思,簡單來說就是,如果不涉及模塊導入的話,__name__的值就是__main__,如果當此模塊被導入引用的話,那么這個模塊內的__name__值就是文件的名字(不帶.py),如下test_1.py:
1 def funny(): 2 print("有趣") 3 4funny()
5 print(__name__)#不涉及調用
test_1.py執行結果為:
1 有趣
2 __main__
如果test_1被導入引用的話,如test_2:
1 import test_1 2
3 print("你好")
test_2x運行結果為:
1 有趣
2 test_1 3 你好
上邊所說要是弄懂的話,那我們在被調用的模塊中,可執行的代碼前加上這么一句判斷,if __name__ == '__main__':,被調用的模塊的代碼就不會被執行了!
python基本運行機制
先大概了解一下python基本運行機制。Python程序運行時不需要編譯成二進制代碼,而直接從源碼運行程序,簡單來說是,Python解釋器將源碼轉換為字節碼,然后再由解釋器來執行這些字節碼。
解釋器的具體工作:
1、完成模塊的加載和鏈接;
2、將源代碼編譯為PyCodeObject對象(即字節碼),寫入內存中,供CPU讀取;
3、從內存中讀取並執行,結束后將PyCodeObject寫回硬盤當中,也就是復制到.pyc或.pyo文件中,以保存當前目錄下所有腳本的字節碼文件。
之后若再次執行該腳本,它先檢查【本地是否有上述字節碼文件】和【該字節碼文件的修改時間是否在其源文件之后】,是就直接執行,否則重復上述步驟。
__pycache__文件夾的意義
因為第一次執行代碼的時候,Python解釋器已經把編譯的字節碼放在__pycache__文件夾中,這樣以后再次運行的話,如果被調用的模塊未發生改變,那就直接跳過編譯這一步,直接去__pycache__文件夾中去運行相關的 *.pyc 文件,大大縮短了項目運行前的准備時間。