漲知識 pyhton中 pycache

2021-10-19 11:41:50 字數 1860 閱讀 3049

用python編寫了乙個工程,如果import了自定義的第三方模組,在第一次執行後,發現工程根目錄下生成了乙個__pycache__資料夾,裡面是和py檔案同名的各種以.cpython-37.pyc結尾的檔案。

cpython-37各項意思,cpython代表的是c語言實現的python直譯器,-37代表的是3.7版本。

如果import多個自定義的第三方模組,則生成多個以模組命名的pyc

至於pyc,是相當於python的編譯檔案,python位元組碼檔案,執行速度快於py檔案,不能文字檢視內容,可以在發布時用pyc來代替原始碼py檔案,隱藏原始碼

將py原始碼檔案編譯成位元組碼:

python -m py_compile main.py
模組的呼叫

python匯入模組時,實際上會把被匯入的模組執行一遍。例如呼叫test.py模組:

def haha():

print("haha")

haha()

主程式main.py:

import test

print("good")

執行結果:

haha

good

如何才能只是單純呼叫而不執行被呼叫模組的**呢?要想被呼叫模組**不被執行,可以使用__name__。如果不涉及模組匯入,name__的值就是__main,如果模組被匯入引用的話,那麼這個模組內的__name__值就是檔案的名字(不帶.py),例如test.py:

def haha():

print("haha")

haha()

print(__name__)

執行結果為:

haha

__main__

如果test被匯入引用的話,例如test2:

import test

print("good")

執行結果為:

haha

test

good

在被呼叫的模組中,可執行**前加上ifname== 『main』:這麼一句判斷,被呼叫的模組的**就不會被執行。

python程式執行時不需要編譯成二進位制**,而直接從原始碼執行程式。簡單來說是,python直譯器將原始碼轉換為位元組碼,然後再由直譯器來執行這些位元組碼。

直譯器的具體工作:

完成模組的載入和鏈結;

將源**編譯為pycodeobject物件(即位元組碼),寫入記憶體中,供cpu讀取;

從記憶體中讀取並執行,結束後將pycodeobject寫回硬碟當中,也就是複製到.pyc或.pyo檔案中,以儲存當前目錄下所有指令碼的位元組碼檔案。

之後若再次執行該指令碼,它先檢查【本地是否有上述位元組碼檔案】和【該位元組碼檔案的修改時間是否在其原始檔之後】,是就直接執行,否則重複上述步驟。

第一次執行**的時候,python直譯器已經把編譯的位元組碼放在__pycache__資料夾中,這樣以後再次執行的話,如果被呼叫的模組未發生改變,那就直接跳過編譯這一步,直接去__pycache__資料夾中去執行相關的*.pyc檔案,大大縮短了專案執行前的準備時間。

漲知識之Python中zip函式

和名字一樣,zip函式就是用來打包和解包的函式,可接受2個以上可迭代的變數,輸出對應位置組成元組後的迭代型別。例如 a a b c b 4,5,6 zip a,b list zip a,b a 4 b 5 c 6 tuple zip a,b a 4 b 5 c 6 在這裡如果各迭代變數長度不一致時也...

漲知識啦 20200802

01 tar格式 解包 tar xvf filename.tar 打包 tar cvf filename.tar dirname 注 tar是打包,不是壓縮!02 gz格式 解壓1 gunzip filename.gz 解壓2 gzip d filename.gz 壓 縮 gzip filename...

pyhton001 基礎知識

建議使用3.5以上,這邊我使用的是3.7.8。終端輸入python 進入直譯器視窗。猶如菜譜,如何完成特定的任務。從本質上說,編寫電腦程式就是使用計算機能夠理解的語言 python 描述一種演算法。這種成為程式,主要由表示式和語句組成。例如2 2 簡單的表示式是使用運算子和函式將字面值組合起來得到的...