pyhton中__pycache__文件夾的產(chǎn)生與作用詳解
用python編寫了一個(gè)工程,但在第一次運(yùn)行后,發(fā)現(xiàn)工程根目錄下生成了一個(gè)__pycache__文件夾,里面是和py文件同名的各種以.cpython-35.pyc結(jié)尾的文件。cpython-35各項(xiàng)意義,cpython代表的是c語言實(shí)現(xiàn)的Python解釋器,-35代表的是3.5版本。至于pyc,需要先了解一下模塊的調(diào)用。
模塊的調(diào)用
Python導(dǎo)入模塊時(shí),實(shí)際上會(huì)把被導(dǎo)入的模塊執(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__。如果不涉及模塊導(dǎo)入,__name__的值就是__main__,如果模塊被導(dǎo)入引用的話,那么這個(gè)模塊內(nèi)的__name__值就是文件的名字(不帶.py),例如test.py:
def haha():
print("haha")
haha()
print(__name__)
執(zhí)行結(jié)果為:
haha
__main__
如果test被導(dǎo)入引用的話,例如test2:
import test
print("good")
運(yùn)行結(jié)果為:
haha
test
good
在被調(diào)用的模塊中,可執(zhí)行代碼前加上if __name__ == '__main__':這么一句判斷,被調(diào)用的模塊的代碼就不會(huì)被執(zhí)行。
由來
Python程序運(yùn)行時(shí)不需要編譯成二進(jìn)制代碼,而直接從源碼運(yùn)行程序。簡(jiǎn)單來說是,Python解釋器將源碼轉(zhuǎn)換為字節(jié)碼,然后再由解釋器來執(zhí)行這些字節(jié)碼。
解釋器的具體工作:
1、完成模塊的加載和鏈接;
2、將源代碼編譯為PyCodeObject對(duì)象(即字節(jié)碼),寫入內(nèi)存中,供CPU讀??;
3、從內(nèi)存中讀取并執(zhí)行,結(jié)束后將PyCodeObject寫回硬盤當(dāng)中,也就是復(fù)制到.pyc或.pyo文件中,以保存當(dāng)前目錄下所有腳本的字節(jié)碼文件。
之后若再次執(zhí)行該腳本,它先檢查【本地是否有上述字節(jié)碼文件】和【該字節(jié)碼文件的修改時(shí)間是否在其源文件之后】,是就直接執(zhí)行,否則重復(fù)上述步驟。
第一次執(zhí)行代碼的時(shí)候,Python解釋器已經(jīng)把編譯的字節(jié)碼放在__pycache__文件夾中,這樣以后再次運(yùn)行的話,如果被調(diào)用的模塊未發(fā)生改變,那就直接跳過編譯這一步,直接去__pycache__文件夾中去運(yùn)行相關(guān)的*.pyc文件,大大縮短了項(xiàng)目運(yùn)行前的準(zhǔn)備時(shí)間。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
人工智能學(xué)習(xí)pyTorch自建數(shù)據(jù)集及可視化結(jié)果實(shí)現(xiàn)過程
這篇文章主要為大家介紹了人工智能學(xué)習(xí)pyTorch自建數(shù)據(jù)集及可視化結(jié)果的實(shí)現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
Python實(shí)現(xiàn)爬取騰訊招聘網(wǎng)崗位信息
這篇文章主要介紹了如何用python爬取騰訊招聘網(wǎng)崗位信息保存到表格,并做成簡(jiǎn)單可視化。文中的示例代碼對(duì)學(xué)習(xí)Python有一定的幫助,感興趣的可以了解一下2022-01-01
Python實(shí)戰(zhàn)項(xiàng)目之MySQL tkinter pyinstaller實(shí)現(xiàn)學(xué)生管理系統(tǒng)
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用MySQL、tkinter、 pyinstaller實(shí)現(xiàn)一個(gè)學(xué)生管理系統(tǒng),大家可以通過案例查缺補(bǔ)漏,提升水平2021-10-10
C站最全Python標(biāo)準(zhǔn)庫總結(jié),你想要的都在這里
這篇文章主要介紹了C站最全的Python標(biāo)準(zhǔn)庫,總共包含10個(gè)類型,希望能對(duì)大家有幫助,看完不虧系列2021-07-07
Keras保存模型并載入模型繼續(xù)訓(xùn)練的實(shí)現(xiàn)
這篇文章主要介紹了Keras保存模型并載入模型繼續(xù)訓(xùn)練的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
python?Ajenti控制面板輕松地管理所有服務(wù)器網(wǎng)站
Ajenti是一個(gè)值得擁有的管理面板,免費(fèi)開源的管理面板工具,可以幫助你集中管理多個(gè)服務(wù)器和網(wǎng)站,Ajenti?支持?Linux、BSD、Mac?OS?X和Windows?等多個(gè)操作系統(tǒng),并且可以通過一個(gè)直觀的?Web?界面來完成各種系統(tǒng)管理任務(wù)2024-01-01
python 用正則表達(dá)式篩選文本信息的實(shí)例
今天小編就為大家分享一篇python 用正則表達(dá)式篩選文本信息的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06

