需要注意的是,編譯成pyc或者pyo檔案后需要將命名改成與源Python命名一致,將其放在源目錄下,雖然其他python檔案呼叫pyd時顯示不能檢測到該模塊,但實際上可以運行,
由于pyc的編譯收到python版本的影響,所以當將編譯后的pyc遷移到另一臺電腦中時,最好保持python環境一致,
很多人學習python,不知道從何學起,
很多人學習python,掌握了基本語法過后,不知道在哪里尋找案例上手,
很多已經做案例的人,卻不知道如何去學習更加高深的知識,
那么針對這三類人,我給大家提供一個好的學習平臺,免費領取視頻教程,電子書籍,以及課程的源代碼!??¤
QQ群:961562169
將python檔案.py編譯成pyc二進制檔案:
python -m py_file.py
或者通過腳本運行
import py_compile ##單個檔案編譯 import compileall ##多個檔案編譯 py_compile.compile('path') ##path是包括.py檔案名的路徑
將python檔案編譯成pyo二進制檔案:
python -O -m py_file.py
pyc是一種二進制檔案,是由py檔案經過編譯后,生成的檔案,是一種byte code,py檔案變成pyc檔案后,加載的速度有所提高,而且pyc是一種跨平臺的位元組碼,是由python的虛擬機來執行的,這個是類似于JAVA或者.NET的虛擬機的概念,
注意事項:pyc的內容,是跟python的版本相關的,不同版本編譯后的pyc檔案是不同的,2.5編譯的pyc檔案,2.4版本的 python是無法執行的,
什么是pyo檔案?
pyo是優化編譯后的程式 python -O 源檔案即可將源程式編譯為pyo檔案
什么是pyd檔案?
pyd是python的元件,windows上為pyd檔案,Linux上為so檔案,pyd檔案實際就是dll檔案
編譯成pyd的方法如下:
# 命令列下:(在專案目錄下打開命令列或者shell,該命令只能編譯一個檔案,編譯之后會發現出現三個檔案,yourmod.c、yourmod.html、yourmod-win_amd64.pyd,此時將c、html和原py檔案洗掉,將pyd檔案命名更改為yourmod就可以)
cythonize -a -i yourmod.pyx
# python代碼:(在原專案中撰寫setup.py檔案)
from distutils.core import setup from Cython.Build import cythonize import os ''' 該檔案的執行需要的在Terminal中輸入 python setup.py build_ext --inplace !!! 使用Cpython 編譯python檔案,關鍵函式編譯成pyd檔案(相當于dll) ''' # 針對多檔案情況設定,單檔案就只寫一個就行 key_funs = ["yourmod1.py", "yourmod2.py", "yourmod3.py"] setup( name="XX app", ext_modules = cythonize(key_funs), ) ''' 1、將編譯后的pyd檔案的命名更改成與原py檔案一致 2、洗掉編譯后得到的c檔案和原py檔案 ''' print("——————", os.getcwd(), "——————") files = os.listdir(os.getcwd()) print(files) for fi in files: if fi.__contains__(".pyd"): re_name = fi.split(".")[0] + ".pyd" print(re_name) os.rename(fi, re_name) elif fi.__contains__(".c") or fi in key_funs: os.remove(fi)
# 運行方式 在原目錄的命令列下執行 python setup.py build_ext --inplace
3、將Python檔案轉成exe封裝(檔案加密)
參考:https://blog.csdn.net/SoaringLee_fighting/article/details/78892876
4、采用hashlib或pycrypto模塊進行文本加密
hashlib模塊:
import hashlib sha1 = hashlib.sha1('文本內容') #加密 osv=sha1.hexdigest() print(osv) bx=bytes(osv,encoding='utf-8') #轉換型別 with open('1.txt','wb') as f: #以二進制寫型別打開 f.write(bx) #寫入檔案 get_sha1('')
pycrypto模塊:
from Crypto.Cipher import AES obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456') message = "The answer is no" ciphertext = obj.encrypt(message) >>> ciphertext '\xd6\x83\x8dd!VT\x92\xaa`A\x05\xe0\x9b\x8b\xf1' >>> obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456') >>> obj2.decrypt(ciphertext) 'The answer is no'
需要注意的是pyd檔案在被其它python檔案呼叫時依然不能被識別,但能夠運行,而且setup.py的檔案的執行需要的在Terminal中輸入 python setup.py build_ext --inplace !!!
基于pyc、pyo容易破解的原因,建議使用pyd檔案進行發布,但python3下pyc、pyo檔案的破解本人未經試驗,只是聽說,故具體選擇哪種方式大家可根據具體情況進行選擇
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/171026.html
標籤:其他
