最近發(fā)現(xiàn)在操作某些.py文件時,下面都有一個.pyc文件。在Python的程序中,是把原始程序代碼放在.py文件里,而Python會在執(zhí)行.py文件的時候。將.py形式的程序編譯成中間式文件(byte-compiled)的.pyc文件,這么做的目的就是為了加快下次執(zhí)行文件的速度。
所以,在我們運行python文件的時候,就會自動首先查看是否具有.pyc文件,如果有的話,而且.py文件的修改時間和.pyc的修改時間一樣,就會讀取.pyc文件,否則,Python就會讀原來的.py文件。
其實并不是所有的.py文件在與運行的時候都會產(chǎn)生.pyc文件,只有在import相應(yīng)的.py文件的時候,才會生成相應(yīng)的.pyc文件。
什么是pyc文件
pyc是一種二進(jìn)制文件,是由py文件經(jīng)過編譯后,生成的文件,是一種byte code。
py文件變成pyc文件后,加載的速度有所提高,而且pyc是一種跨平臺的字節(jié)碼,是由Python的虛擬機(jī)來執(zhí)行的,這個是類似于Java或者.NET的虛擬機(jī)的概念。
pyc的內(nèi)容,是跟python的版本相關(guān)的,不同版本編譯后的pyc文件是不同的,2.5編譯的pyc文件,2.4版本的python是無法執(zhí)行的。
為什么需要pyc文件
因為py文件是可以直接看到源碼的,所以就需要編譯為pyc后,再發(fā)布出去。
當(dāng)然,pyc文件也是可以反編譯的,不同版本編譯后的pyc文件是不同的,根據(jù)python源碼中提供的opcode,可以根據(jù)pyc文件反編譯出py文件源碼,網(wǎng)上可以找到一個反編譯python2.3版本的pyc文件的工具。
不過你可以自己修改python的源代碼中的opcode文件,重新編譯python,從而防止不法分子的破解。
生成單個pyc文件
python就是個好東西,它提供了內(nèi)置的類庫來實現(xiàn)把py文件編譯為pyc文件,這個模塊就是?py_compile 模塊。
使用方法非常簡單,如下所示,直接在idle(Pyhton集成開發(fā)環(huán)境)中,就可以把一個py文件編譯為pyc文件了。(假設(shè)在windows環(huán)境下)
importpy_compile
py_compile.compile(r'H:/game/test.py')
compile函數(shù)原型:compile(file[,cfile[, dfile[, doraise]]])
file 表示需要編譯的py文件的路徑
cfile 表示編譯后的pyc文件名稱和路徑,默認(rèn)為直接在file文件名后加c 或者 o,o表示優(yōu)化的字節(jié)碼
dfile :it is used as the name of the source file in error messages instead of?file
doraise 可以是兩個值,True或者False,如果為True,則會引發(fā)一個PyCompileError,否則如果編譯文件出錯,則會有一個錯誤,默認(rèn)顯示在sys.stderr中,而不會引發(fā)異常(來自python2.5文檔)
批量生成pyc文件
一般來說,我們的工程都是在一個目錄下的,一般不會說僅僅編譯一個py文件而已,而是需要把整個文件夾下的py文件都編譯為pyc文件,python又為了我們提供了另一個模塊:compileall 。使用方法如下:
importcompileall
compileall.compile_dir(r'H:/game')
這樣就把game目錄,以及其子目錄下的py文件編譯為pyc文件了。嘿嘿,夠方便吧。來看下compile_dir函數(shù)的說明:
compile_dir(dir[, maxlevels[, ddir[, force[, rx[, quiet]]]]])
dir 表示需要編譯的文件夾位置
maxlevels 表示需要遞歸編譯的子目錄的層數(shù),默認(rèn)是10層,即默認(rèn)會把10層子目錄中的py文件編譯為pyc
ddir :it is used as the base path from which the filenames used in error messages will be generated。
force 如果為True,則會強(qiáng)制編譯為pyc,即使現(xiàn)在的pyc文件是最新的,還會強(qiáng)制編譯一次,pyc文件中包含有時間戳,python編譯器會根據(jù)時間來決定,是否需要重新生成一次pyc文件
rx 表示一個正則表達(dá)式,比如可以排除掉不想要的目錄,或者只有符合條件的目錄才進(jìn)行編譯
quiet 如果為True,則編譯后,不會在標(biāo)準(zhǔn)輸出中,打印出信息
(來自python2.5文檔)
通過上面的方法,可以方便的把py文件編譯為pyc文件了,從而可以實現(xiàn)部分的源碼隱藏,保證了python做商業(yè)化軟件時,保證了部分的安全性。
原文鏈接:https://blog.csdn.net/laobai1015/article/details/88292848