編譯python文件
python編譯可執行文件的擴展名
python程序的擴展名有.py、.pyc、.pyo和.pyd。.py是源文件,.pyc是源文件編譯後的文件,.pyo是源文件優化編譯後的文件,.pyd是其他語言寫的python庫。 擴展名 在寫Python程序時我們常見的擴展名是py, pyc,其實還有其他幾種擴展名。下面是幾種擴展名的用法。 py:py就是最基本的源碼擴展名。windows下直接雙擊運行會調用python.exe執行。 pyw:pyw是另一種源碼擴展名,跟py唯一的區別是在windows下雙擊pyw擴展名的源碼會調用pythonw.exe執行源碼,這種執行方式不會有命令行窗口。主要用於GUI程序發布時不需要看到控制台信息的情況。 pyc:在執行python代碼時經常會看到同目錄下自動生成同名的pyc文件。這是python源碼編譯後的位元組碼,一般會在代碼執行時自動生成你代碼中引用的py文件的pyc文件。這個文件可以直接執行,用文本編輯器打開也看不到源碼。 pyo:pyo是跟pyc類似的優化編碼後的文件。 pyd:pyd並非從python程序生成,而是其他語言寫成的可以被python調用的擴展。
② Python程序代碼混淆、編譯、打包、運行(桌面程序防破解向)
像Python這種解釋性的語言,要想私有化部署的同時又保護好源碼,就像是對於魚和熊掌的追求。
雖然做不到盡善盡美,但是對代碼進行混淆,增加一點破解的難度,或許能規避一些泄露的風險。
本次演示環境:linux
確保要發布的包根目錄("demo")中有__main__.py文件,這個是程序執行入口。
編譯
批量改名.pyc文件
移動.pyc文件
清理.py文件
清理__pycache__文件夾
打包成zip
運行時只要將zip文件作為參數即可
最終整合腳本
調用方式
對於在變數和函數名上的混淆有點小兒科,而對於跨文件的類名的混淆又太容易實現。
所以對於混淆程度的取捨,要視工程的規模而定。
2.1 混淆工具pyminifier
在原來的工具 pyminifier上修復了幾個bug。
安裝:
python3 安裝
或者clone下來,自行安裝
使用例子
2.2 源碼變更
不同的配置對於源碼的要求不同,以下是筆者踩過的坑。
其他混淆想法
結合混淆、編譯和打包,嘗試出以下發布腳本。
主要的思路 :創建一個工作目錄tmp,然後在此目錄下混淆、編譯python代碼,完成後把內容打包成pyc文件,再將pyc文件和其他配置文件移動到dist,發布dist即可。
混淆的目的是最大程度保護源碼,在發布到客戶端後不被輕易破解。
③ python寫的程序,轉成了exe文件,怎麼進行反編譯為python源碼
1、電腦桌面,輸入「win+R」組合鍵,在彈出窗口中輸入「cmd」,點擊確定。
④ python 「編譯的」 Python 文件的理解是什麼
為了加快載入模塊的速度,Python 會在 __pycache__ 目錄下以 mole.version.pyc 名字緩存每個模塊編譯後的版本,這里的版本編制了編譯後文件的格式。它通常會包含 Python 的版本號。例如,在 CPython 3.3 版中,spam.py 編譯後的版本將緩存為 __pycache__/spam.cpython-33.pyc。這種命名約定允許有不同發布和不同版本的 Python 編譯的模塊同時存在。
Python 會檢查源文件與編譯版的修改日期以確定它是否過期並需要重新編譯。這是完全自動化的過程。同時,編譯後的模塊是跨平台的,所以同一個庫可以在不同架構的系統之間共享。
Python 不檢查在兩個不同環境中的緩存。首先,它會永遠重新編譯而且不會存儲直接從命令行載入的模塊。其次,如果沒有源模塊它不會檢查緩存。若要支持沒有源文件(只有編譯版)的發布,編譯後的模塊必須在源目錄下,並且必須沒有源文件的模塊。
部分高級技巧:
為了減少一個編譯模塊的大小,你可以在 Python 命令行中使用 -O 或者 -OO。-O 參數刪除了斷言語句,-OO 參數刪除了斷言語句和 __doc__ 字元串。
因為某些程序依賴於這些變數的可用性,你應該只在確定無誤的場合使用這一選項。「優化的」 模塊有一個 .pyo 後綴而不是 .pyc 後綴。未來的版本可能會改變優化的效果。
來自 .pyc 文件或 .pyo 文件中的程序不會比來自 .py 文件的運行更快;.pyc 或 .pyo 文件只是在它們載入的時候更快一些。
compileall 模塊可以為指定目錄中的所有模塊創建 .pyc 文件(或者使用 -O 參數創建 .pyo 文件)。
在 PEP 3147 中有很多關這一部分內容的細節,並且包含了一個決策流程。