Fork me on GitHub

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('<center>Hello World!</center>', 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 等更稳固的方案,可形成最佳实践。

 
posted @ 2025-07-18 19:15  stardsd  阅读(1168)  评论(0)    收藏  举报