PAYATHON 2026

Nuitka 打包 PyQt6 应用时如何减小约 1 GB 的体积?

数据小陈

结论

约 1 GB 的体积更可能来自应用依赖和运行时文件,而不是入口脚本里的几条 import。你的应用实际使用 Pandas、SciPy、Matplotlib 和 PyQt6,这些库及其依赖都可能被打进独立发布包。把 from pandas import ... 改成只导入少数符号,通常不会让 Nuitka 只打包这些符号对应的少量代码。

先确认你测量的是单个 exe,还是 Nuitka 生成的整个独立发布目录。--standalone 通常会生成一个包含 exe 和依赖文件的目录,比较大小时应看整个目录。--onefile 会把这些文件封装进一个可执行文件,但不会因此移除依赖。单个文件变大,不代表总依赖量发生了变化。

先找出体积来自哪里

用 Nuitka 编译报告查看它发现的模块和文件,再按体积排查依赖。下面的命令仅作示意,请把入口文件名替换成实际文件名:

python -m nuitka --standalone --report=compilation-report.xml main.py

先按当前功能编译一次,记录发布目录的大小和报告中的主要依赖。之后每次只调整一项,再比较整个发布目录的大小,就能判断变化来自哪里,不必只根据导入语句猜测。

按实际功能减少依赖

只有不再需要某项功能时,移除相应依赖才可能明显减小体积:

  • 如果可以不用 Pandas,可以评估改用 Python 标准库 csv 读取文件,并相应调整 PandasModel 和表格数据处理方式。仅把 read_csv 改成另一种导入形式,不会移除 Pandas。
  • 如果分析逻辑不再使用 SciPy,可以移除 scipy.stats.zscore 和 scipy.signal.detrend 等调用,再考虑排除 SciPy。替换计算时,要确认新实现符合数据处理要求,因为结果可能受算法定义和边界情况影响。
  • 如果不再需要 Matplotlib 绘图,可以移除 MplGraphWidget 及相关代码,再比较体积。若绘图是必需功能,仅缩窄 import 语句并不能安全地删掉 Matplotlib 依赖。

不要直接排除仍在运行路径上使用的包。例如,只有在移除 SciPy 的用法并确认程序不再导入它之后,才考虑使用 --nofollow-import-to=scipy。否则,打包可能成功,但应用会因缺少模块而在运行时报错。根据报告逐项添加排除规则,并在目标机器或干净环境中检查对应功能。

检查资源路径代码

给出的代码中:

if hasattr(sys, "-MEIPASS"):

这段代码检查的是名为 -MEIPASS 的属性。它不是常见的 PyInstaller 属性写法,也不是减小 Nuitka 体积的设置。图标、Logo 等资源的打包和定位方式需要单独梳理,并确认应用在发布后能找到这些资源。资源路径问题和依赖体积是两回事。

发布时的选择

如果主要目的是方便实验室内分发,可以考虑压缩整个 --standalone 输出目录,或制作安装包。选择 --onefile 时,应把它看作封装形式的变化,而不是依赖瘦身方案。无论采用哪种形式,都应在没有开发环境依赖的机器上启动应用,并检查 CSV 读取、分析、表格展示和绘图功能。

备注:内容仅供参考。