👉 项目官网:https://www.python-office.com/ 👈
👉 本开源项目的交流群 👈
大家好,这里是程序员晚枫,全网同名。
目标:让用户像安装 QQ 一样双击 setup.exe;让开发者像 VS Code 一样动态装插件;让老板像卖商业软件一样防止破解。
本讲 20 分钟,三条路线任选其一即可落地。
10.1 自解压安装包(Inno Setup / NSIS / pkgbuild)
10.1.1 Windows:Inno Setup 5 行脚本installer.iss
1 | [Setup] |
一键打包
1 | iscc installer.iss # 生成 MyTool_Setup.exe |
10.1.2 macOS:pkgbuild + productbuild
1 | pkgbuild --root dist/MyTool.app --identifier com.acme.myapp --version 1.2.3 MyTool.pkg |
10.1.3 Linux:AppImage 单文件
1 | wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage |
10.2 插件化架构:运行时动态加载外部 .py
10.2.1 核心思路
- 主程序仅打包最小依赖
- 插件目录
plugins/
随安装包一起释放 - 启动时
importlib.import_module
加载
10.2.2 spec 最小骨架
1 | a = Analysis( |
10.2.3 插件热更新流程
- 用户点击“检查更新”
- 下载 zip → 解压到
plugins/
- 重启主程序即可生效
示例代码1
2
3
4
5import zipfile, pathlib, importlib
def install_plugin(zip_path):
with zipfile.ZipFile(zip_path) as z:
z.extractall(pathlib.Path(__file__).parent / 'plugins')
importlib.invalidate_caches()
10.3 商业级保护三板斧
10.3.1 代码混淆 + 加密字节码
- pyinstaller 自带
--key mypass
(弱加密,仅防窥) - 商业级:Nuitka +
--lto
+--clang
编译为原生二进制
10.3.2 授权校验(在线 + 离线)
- 在线:启动时调用
https://license.xxx.com/activate
- 离线:RSA 公钥验证 license 文件
示例(简化)1
2
3
4from cryptography.hazmat.primitives.asymmetric import rsa, padding
def check_license(lic_file):
with open(lic_file, 'rb') as f:
return pub_key.verify(f.read(), signature, padding.PKCS1v15(), hashes.SHA256())
10.3.3 反调试 & 反虚拟机
- 检测调试器 (
ctypes.windll.kernel32.IsDebuggerPresent()
) - 检测沙箱 (
sys.platform == 'linux' and os.path.exists('/.dockerenv')
)注意:过度保护易被误报,需权衡。
10.4 一条龙示例仓库(可复制)
1 | myapp-pro/ |
make all
一键出:
MyTool_Setup.exe
(带签名)MyTool.pkg
(已 Notarize)MyTool-x86_64.AppImage
10.5 常见疑问 60 秒速答
Q1:插件需要重新打包吗?
A:不需要,只要插件目录在 _MEIPASS
外即可。
Q2:Nuitka 和 pyinstaller 能混用吗?
A:不能,但可把核心算法先用 Nuitka 打成 .pyd
,再由 pyinstaller 收集。
Q3:加密后杀毒误报?
A:提交 VT 白名单 + 代码签名 + 减少可疑 API 调用。
小结 & 作业
• 安装包:Inno / pkgbuild / AppImage 三选一即可
• 插件化:主程序瘦身 + 动态加载
• 商业保护:混淆 → 授权 → 反调试,按预算递进
作业:
- 用 Inno Setup 把自己的项目做成安装包
- 加一个“插件市场”按钮,能下载并热加载 zip 插件
下节课《实战串讲》把 3 个真实项目(CLI、GUI、ML)完整复盘。
大家在学习课程中有任何问题,欢迎+微信和我交流👉我的联系方式:微信、读者群、1对1、福利