由于python設(shè)計(jì)的初衷是開源的,因此py文件是可以直接看到源碼的。但如果開發(fā)商業(yè)軟件,則不可能將源碼泄漏出去,因此py代碼加密保護(hù)就顯得十分重要了。 pyc文件是py文件經(jīng)過編譯后生成的二進(jìn)制文件,不是明文顯示,因此可以發(fā)布PYC文件以隱藏源代碼。與py文件相比PYC文件擁有更快的加載速度,執(zhí)行速度沒有區(qū)別。pyc是一種跨平臺(tái)的字節(jié)碼,于是由python的虛擬機(jī)來執(zhí)行的,這個(gè)是類似于JAVA或者.NET的虛擬機(jī)的概念。值得注意的是,pyc的內(nèi)容是跟python的版本相關(guān)的,不同版本編譯后的pyc文件是不同的,2.5編譯的pyc文件,2.4版本的python是無法執(zhí)行的。 當(dāng)然,pyc文件也是可以反編譯的,不同版本編譯后的pyc文件是不同的,根據(jù)python源碼中提供的opcode,可以根據(jù)pyc文件反編譯出py文件源碼,網(wǎng)上可以找到一個(gè)反編譯python2.3版本的pyc文件的工具,不過該工具從python2.4開始就要收費(fèi)了,如果需要反編譯出新版本的pyc文件的話,就需要自己動(dòng)手了,不過你可以自己修改python的源代碼中的opcode文件,重新編譯python,從而防止不法分子的破解。
生成單個(gè)pyc文件 python提供了內(nèi)置的類庫來實(shí)現(xiàn)把py文件編譯為pyc文件,這個(gè)模塊就是py_compile模塊。使用方法如下: [root@server-1 test]# python -m py_compile test.py [root@server-1 test]# python -O -m py_compile test.py -O 優(yōu)化成字節(jié)碼(pyo) -m 表示把后面的模塊當(dāng)成腳本運(yùn)行 -OO 表示優(yōu)化的同時(shí)刪除文檔字符串 python的編譯是通過使用py_compile的compile()方法來實(shí)現(xiàn)的。 compile函數(shù)原型:
批量生成pyc文件 一般來說,我們的工程都是在一個(gè)目錄下的,一般不會(huì)說僅僅編譯一個(gè)py文件而已,而是需要把整個(gè)文件夾下的py文件都編譯為pyc文件,python又為了我們提供了另一個(gè)模塊:compileall。使用方法如下: [root@server-1 test]# python -m compileall . Listing . ... Compiling ./test.py ... Compiling ./mgmt.py ... 如果看過compileall模塊的源碼我們可以知道compileall編譯.py文件其實(shí)還是調(diào)用了py_compile的compile()方法。 總結(jié)通過上面的方法,可以方便的把py文件編譯為pyc文件了,從而可以實(shí)現(xiàn)部分的源碼隱藏,保證了python做商業(yè)化軟件時(shí),保證了部分的安全性吧,如果想實(shí)現(xiàn)真正的加密:Python代碼加密,就要改PYTHON源碼,做自己的加密模塊了。
|
|
|