🧩 Nuitka 打包避坑记录(Nuitka Packaging Pitfalls)

CurtisYan Lv3

起因

最近做了个一键更改网络适配器的程序,然后在将程序打包的过程中我遇到了一些问题,记录下来方便以后参考
项目地址:https://github.com/CurtisYan/NetAdapterTool

photo
photo

一、版本问题:虚拟环境中的 Nuitka 未升级

在我第一次使用 Nuitka 打包时,项目运行在虚拟环境(virtual environment)中,而我使用以下命令升级了 Nuitka:

1
pip install --upgrade nuitka

然而,这条命令实际上只升级了全局环境(global environment)中的 Nuitka,而虚拟环境里的 Nuitka 并没有被升级
结果就是:第一次打包失败后,我以为升级成功,第二次打包仍然失败。

经验教训:

  • 如果你在虚拟环境中工作,记得使用该虚拟环境的 pip
    例如:

    1
    path\to\venv\Scripts\pip install --upgrade nuitka
  • 或者在虚拟环境激活后再执行升级命令。


二、UPX 压缩路径引发 PowerShell 调用异常

我想进一步使用 UPX(Ultimate Packer for eXecutables) 来压缩打包体积,于是下载安装了 UPX。
最初根据网上教程,我直接修改了系统环境变量(Environment Variables)中的 PATH 值,将其更改为 UPX 的路径:
例如:

1
D:\upx\upx.exe

结果出现了严重问题:
我的项目在运行时需要调用 PowerShell(Windows PowerShell),而修改 PATH 后导致 PowerShell 无法被正常调用。

起初我排查了两遍所有项目代码,完全没发现问题。后来才意识到是 系统 PATH 配置被破坏
我尝试使用多种命令修复无果,最后在 火绒(Huorong)安全软件 → 系统修复 → 一键修复系统 PATH 功能中才彻底恢复正常。

⚠️ 关键提醒:

  • 不要直接修改 PATH 的值!
  • 应该双击进入 PATH,新增 UPX 路径条目,而不是覆盖原值。
  • 这样不会影响 PowerShell 或其他系统命令。

三、我的 Nuitka 打包命令详解

以下是我最终稳定可用的打包命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
nuitka ^
--standalone --onefile ^
--enable-plugin=pyqt5 ^
--include-qt-plugins=platforms,imageformats,styles ^
--python-flag=-OO ^
--nofollow-import-to=PyQt5.QtQml,PyQt5.QtQuick,PyQt5.QtWebEngineWidgets,PyQt5.QtWebKit,PyQt5.QtMultimedia,PyQt5.QtNetwork,PyQt5.QtSql,PyQt5.QtPrintSupport,tkinter,matplotlib,numpy,pandas ^
--enable-plugin=upx ^
--upx-binary="D:\upx\upx.exe" ^
--onefile-no-compression ^
--windows-uac-admin ^
--windows-console-mode=disable ^
--windows-icon-from-ico=img/NA.ico ^
--include-data-dir=img=img ^
--product-name="NetAdapterTool" ^
--file-version=1.0.0 ^
--product-version=1.0.0 ^
--output-filename="网络适配器修改器.exe" ^
gui.py

🔍 参数说明

参数 说明
--standalone / --onefile 生成独立可执行文件(standalone executable)。
--enable-plugin=pyqt5 启用 PyQt5 插件支持。
--include-qt-plugins=platforms,imageformats,styles 仅包含平台、图像格式、样式插件,满足 QIcon/QPixmap(jpg/ico)、窗口显示需求。
--python-flag=-OO 删除 docstringassert,减小体积但不影响功能。
--nofollow-import-to=... 避免将未使用的 PyQt 模块、numpy、pandas 等大依赖错误打包。
--enable-plugin=upx 启用 UPX 压缩插件。
--upx-binary="D:\upx\upx.exe" 指定 UPX 可执行文件路径。
--onefile-no-compression 单文件打包但不额外压缩,启动速度更快。
--windows-uac-admin 生成需要管理员权限的可执行文件。
--windows-console-mode=disable 关闭命令行窗口。
--windows-icon-from-ico 指定程序图标。
--include-data-dir 打包资源目录(images、icons 等)。
--product-name / --file-version / --product-version 设置程序元信息。
--output-filename 自定义生成的 .exe 文件名。

四、总结与感想

  1. 虚拟环境(Virtualenv)问题 是新手最容易忽略的点。
    在虚拟环境中安装或升级依赖时,一定要确保执行的是该环境下的 pip
  2. UPX 环境变量(Environment Variable) 修改不当会导致系统命令失效。
    正确做法是添加而非替换 PATH。
  3. Nuitka 参数 虽多,但理解每一项后其实十分强大,可以媲美 PyInstaller,同时体积更小、性能更优。

五、个人感受

我这次用 GPT-5(Thinking 模式) 帮我优化 Nuitka 指令,体验非常好。
它的思考逻辑远超 Claude 4 —— 思维全面、分析深入、参数解释到位
唯一的小缺点是:速度有点慢,但慢工出细活,这种质量值得等待。

gpt5
gpt5