一、使用 PyInstaller 打包 PyQt 程序
PyInstaller 是最简单高效的打包工具之一,支持大部分主流库(如 PyQt5/PyQt6、requests、numpy 等),适合快速封装桌面 GUI 应用。
安装 PyInstaller
pip install pyinstaller
示例:打包一个简单 PyQt 应用
假设你有一个名为 main.py 的 PyQt5 应用如下:
# main.py
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QWidget
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle('Hello PyInstaller')
window.setGeometry(100, 100, 280, 80)
label = QLabel('
window.show()
sys.exit(app.exec_())
打包命令(单文件)
pyinstaller -F -w main.py
说明:
-F:打包成单个可执行文件
-w:不显示控制台窗口(GUI应用必加)
生成的可执行文件位于 dist/main.exe(Windows)
常见问题
缺失 DLL(如 Qt 资源文件):使用 .spec 文件增加 datas 字段
图标设置:加 --icon=app.ico
二、Cython 编译
.py
为
.pyd
+ PyInstaller 打包
使用 Cython 编译可有效提升安全性,防止源码被轻易反编译。
安装 Cython
pip install cython
步骤一:将
.py
编译为
.pyd
创建 hello.py:
# hello.py
def greet():
print("Hello from compiled Cython module!")
创建 setup.py:
from setuptools import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize("hello.py", language_level=3)
)
运行:
python setup.py build_ext --inplace
此时会生成 hello.cp38-win_amd64.pyd(根据你的 Python 版本和平台)。
然后,删除源代码 hello.py,保留 .pyd。
步骤二:主程序引用
.pyd
并打包
# main.py
import hello
hello.greet()
打包:
pyinstaller -F main.py
说明:由于 .pyd 文件已经是二进制格式,反编译难度较高,增强了安全性。
三、PyArmor 加密源码 + PyInstaller 打包
PyArmor 是一款专为 Python 加壳和加密设计的工具,配合 pyinstaller 使用效果更佳。
安装 PyArmor
pip install pyarmor
加密代码
pyarmor gen main.py
加密后的代码在 dist/ 下,可配合 PyInstaller 打包:
pyinstaller -F dist/main.py
优点:
高级加密方式、运行环境绑定
支持过期时间、机器指纹绑定
可用授权机制防止盗版
四、使用 Nuitka 编译为真正的 C/C++ 程序
Nuitka 是将 Python 源码完全转换成 C/C++ 并编译成机器码的工具,性能和安全性都更优秀。
安装 Nuitka
pip install nuitka
还需安装编译器,如:
Windows: Visual Studio Build Tools
macOS: brew install gcc
Linux: sudo apt install g++
编译命令(Windows 示例)
nuitka --onefile --windows-disable-console main.py
说明:
--onefile:打包为单文件
--windows-disable-console:不显示命令行窗口(GUI 应用用此选项)
Nuitka 支持插件机制
如果你使用的是 PyQt,可以添加插件:
nuitka --enable-plugin=pyqt5 --onefile main.py
注意事项
初次编译较慢(C代码生成与构建)
编译成功后生成的 .exe 执行效率高、体积小
依赖收集需要精细调试,推荐用于项目收尾阶段
五、推荐组合方案(安全 + 简洁)
场景
推荐组合
快速迭代,开发测试
PyInstaller(快捷打包,调试方便)
对源码保护有较高需求
Cython + PyInstaller 或 PyArmor + PyInstaller
对性能要求高
Nuitka
分发内网客户或设备部署
Nuitka 或 Cython 编译 .pyd 后打包
要求极致体积优化 + 性能
Nuitka + --static-libpython 选项
六、附录:PyInstaller
.spec
文件使用技巧
修改 .spec 文件可定制资源、隐藏依赖、压缩体积。
示例(添加图标和资源文件):
a = Analysis(
['main.py'],
datas=[('my_data/', 'my_data/')],
...
)
exe = EXE(
...,
icon='app.ico'
)
打包命令:
pyinstaller main.spec
小结
Python 打包的关键是根据使用场景权衡开发效率、反编译难度、运行性能等因素:
快速交付选 PyInstaller
安全分发选 Cython + PyInstaller 或 PyArmor
性能部署选 Nuitka
前期开发用 PyInstaller,正式上线再切换为 Cython/Nuitka 等更稳固的方案,可形成最佳实践。