1. 安装 PyArmor
使用 pip
安装 PyArmor:
pip install pyarmor
2. 加密单个脚本文件
假设你有一个Python脚本 app.py
,你可以使用以下命令进行加密:
pyarmor gen --output dist read_config.p
运行后,PyArmor会生成一个dist
目录,里面包含加密后的文件:
dist/ pytransform/ app.py app.pyc
app.py
:加密后的脚本。app.pyc
:编译后的加密字节码文件。pytransform/
:PyArmor运行时库,必须和加密代码一起分发。
3. 加密整个项目
如果你的项目有多个Python文件,例如:
my_project/ main.py utils.py module/ __init__.py helper.py
你可以直接加密整个项目:
pyarmor obfuscate -r my_project/
-r
表示递归地加密所有子目录中的Python文件。- PyArmor会在项目的每个目录中生成对应的加密文件。
4. 设置有效期(运行时间限制)
你可以为加密的代码设置一个有效期,例如在2024年12月31日前有效:
pyarmor obfuscate --expire "2024-12-31" app.py
5. 绑定硬件(限制运行机器)
可以将代码绑定到特定的机器,只有提供正确的授权密钥时代码才能运行:
-
生成授权密钥:
pyarmor gen --bind-disk app.py
-
加密代码,并绑定到生成的授权密钥:
pyarmor obfuscate --bind-disk app.py
6. 生成可执行文件
PyArmor 可以结合 PyInstaller 将加密代码打包成可执行文件。
步骤:
- 先用 PyArmor 加密你的代码:
pyarmor obfuscate app.py
- 再用 PyInstaller 打包加密后的代码:
pyinstaller --onefile dist/app.py
最终会生成一个加密后的可执行文件,既保护了源码,又能直接运行。
注意事项
- PyArmor 提供了基本的代码混淆和加密,但无法完全防止高级反编译和反向工程手段。
- pytransform 运行时库是必须的,分发时要与加密后的代码一起提供。
- PyArmor 是商业软件,免费版本有功能限制(例如最大文件数、授权时间等)。
常用命令:
- 单个文件加密:
pyarmor obfuscate app.py
- 递归加密项目:
pyarmor obfuscate -r my_project/
- 设置有效期:
pyarmor obfuscate --expire "2024-12-31" app.py
- 绑定硬件:
pyarmor obfuscate --bind-disk app.py
步骤1:确保项目能正常运行
先测试加密后的 Flask 项目是否能正常运行。进入 dist/src
目录,运行加密后的 app.py
:
cd dist/src python app.py
步骤2:使用 PyInstaller 打包
在 dist
目录下运行以下命令:
pyinstaller --onefile --add-data "src/templates;templates" --add-data "src/static;static" src/app.py
参数说明:
--onefile
:将所有依赖和代码打包成一个独立的可执行文件。--add-data
:src/templates;templates
:将src/templates
目录添加到打包的可执行文件中,解压到templates
目录。src/static;static
:将src/static
目录添加到打包的可执行文件中,解压到static
目录。
4. 处理 Flask 代码中的资源路径
在打包后的可执行文件中,资源文件的路径需要特殊处理,因为 PyInstaller 会将资源解压到临时目录中(sys._MEIPASS
)。你需要修改 Flask 代码,让它能够正确访问模板和静态文件。
修改 app.py
在 app.py
中,添加对 sys._MEIPASS
的处理:
import os import sys from flask import Flask, render_template # 处理模板和静态文件路径 base_path = getattr(sys, '_MEIPASS', os.path.abspath(".")) app = Flask(__name__, template_folder=os.path.join(base_path, "templates"), static_folder=os.path.join(base_path, "static")) @app.route("/") def index(): return render_template("index.html") if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)
sys._MEIPASS
是 PyInstaller 在运行时提取临时目录的路径。- 通过
os.path.join(base_path, "templates")
和os.path.join(base_path, "static")
确保 Flask 正确加载模板和静态资源。
5. 运行打包后的应用
打包完成后,进入 dist
目录,找到生成的可执行文件(app.exe
),运行:
.\app.exe
Flask 应用将启动,并且能正确加载 templates
和 static
目录中的资源。
6. 部署文件
最终,你需要部署以下内容到服务器:
-
仅加密代码版本:
dist/src/
(包含加密后的 Python 文件)static/
和templates/
目录pytransform/
运行时库
-
打包为单个 exe 的版本(可选):
- 只需部署
app.exe
,无需其他文件。
- 只需部署