您好,登錄后才能下訂單哦!
用python編寫了一個工程,但在第一次運行后,發(fā)現(xiàn)工程根目錄下生成了一個__pycache__文件夾,里面是和py文件同名的各種以.cpython-35.pyc結(jié)尾的文件。cpython-35各項意義,cpython代表的是c語言實現(xiàn)的Python解釋器,-35代表的是3.5版本。至于pyc,需要先了解一下模塊的調(diào)用。
模塊的調(diào)用
Python導入模塊時,實際上會把被導入的模塊執(zhí)行一遍。例如調(diào)用test.py模塊:
def haha(): print("haha") haha()
主程序main.py:
import test print("good")
執(zhí)行結(jié)果:
haha
good
如何才能只是單純調(diào)用而不執(zhí)行被調(diào)用模塊的代碼呢?要想被調(diào)用模塊代碼不被執(zhí)行,可以使用__name__。如果不涉及模塊導入,__name__的值就是__main__,如果模塊被導入引用的話,那么這個模塊內(nèi)的__name__值就是文件的名字(不帶.py),例如test.py:
def haha(): print("haha") haha() print(__name__)
執(zhí)行結(jié)果為:
haha
__main__
如果test被導入引用的話,例如test2:
import test print("good")
運行結(jié)果為:
haha
test
good
在被調(diào)用的模塊中,可執(zhí)行代碼前加上if __name__ == '__main__':這么一句判斷,被調(diào)用的模塊的代碼就不會被執(zhí)行。
由來
Python程序運行時不需要編譯成二進制代碼,而直接從源碼運行程序。簡單來說是,Python解釋器將源碼轉(zhuǎn)換為字節(jié)碼,然后再由解釋器來執(zhí)行這些字節(jié)碼。
解釋器的具體工作:
1、完成模塊的加載和鏈接;
2、將源代碼編譯為PyCodeObject對象(即字節(jié)碼),寫入內(nèi)存中,供CPU讀??;
3、從內(nèi)存中讀取并執(zhí)行,結(jié)束后將PyCodeObject寫回硬盤當中,也就是復制到.pyc或.pyo文件中,以保存當前目錄下所有腳本的字節(jié)碼文件。
之后若再次執(zhí)行該腳本,它先檢查【本地是否有上述字節(jié)碼文件】和【該字節(jié)碼文件的修改時間是否在其源文件之后】,是就直接執(zhí)行,否則重復上述步驟。
第一次執(zhí)行代碼的時候,Python解釋器已經(jīng)把編譯的字節(jié)碼放在__pycache__文件夾中,這樣以后再次運行的話,如果被調(diào)用的模塊未發(fā)生改變,那就直接跳過編譯這一步,直接去__pycache__文件夾中去運行相關的*.pyc文件,大大縮短了項目運行前的準備時間。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。