Python程序的打包与发布

Python程序的打包与发布

一、使用 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('

Hello World!
', parent=window)

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 等更稳固的方案,可形成最佳实践。

相关内容

多节桤木橱柜的优缺点是什么?
365地址

多节桤木橱柜的优缺点是什么?

⌚ 08-09 👁️‍🗨️ 9024
关于 Office:我使用的是哪个版本的 Office?
365速发国际app

关于 Office:我使用的是哪个版本的 Office?

⌚ 08-11 👁️‍🗨️ 6452

友情链接