Nuitka 打包 Python 项目

Pyinstaller 打包工具

开发 Python 的工具过程中,有时需要将工具打包成单独执行的工具,相较于 Go 语言直接打包成 exe 的便捷,Python 项目的打包可以说是非常麻烦。

在 Windows 系统上打包项目,最常使用的就是 Pyinstaller 工具,可以使用 pyinstaller -F xxx.py 命令将文件打包成 exe 文件,但是缺点也非常明显,一个是包非常大,特别是没使用单独的项目环境时。

如果使用的是 anconda 的 base 环境,打好的包大的让人绝望。导致这种情况的主要原因是因为 Pyinstaller 是将整个运行环境打包起来。

Nuitka 打包

在阅读打包相关的内容时发现许多人推荐使用 Nuitka 工具,说相同的项目,打包完的大小要远比 Pyinstaller 的小,而且打包速度非常快,启动也非常快。

Nuitka 安装及使用

许多人推荐使用 pip install Nuitka ,但是因为我是在离线环境下安装,而且使用的 Python 版本也比较旧,所以只能离线安装对应的工具。

下载 Nuitka zip 包

首先需要从 GitHub 上下载对应的 zip 包 ,然后使用 pip install Nuitka.zip 直接安装。

下载插件包

安装好之后,就使用命令打包项目,中间一共遇到 3 个软件包需要下载。

winlibs-x86_64-posix-seh-gcc-11.3.0-llvm-14.0.3-mingw-w64msvcrt-10.0.0-r3.zip
主要是 gcc 的编译程序,如果提前安装了,是可以不安装的。
ccache-4.6windows-32.zip
C/C++ 的编译器缓存,可以加速 C/C++ 的编译过程。
depends22_x64.zip
dependency walker 是用来扫描 windows 下依赖关系工具,并建立所有相关模块的分层树形图。

将 3 个包放到对应的下载路径下,就可以在执行打包的时候自动安装。

Windows 下的路径为: %HOME%\AppData\Local\Nuitka\Nuitka\Cache\downloads 目录下。

使用过程

nuitka \
--standalone # 方便移植到其他机器,不再安装 Python \
--show-memory --show-progress # 展示整个安装进度过程 \
--nofollow-imports # 不编译代码中所有的 imports 特别是比较大的类,比如 keras ,numpy 之类 \
--plugin-enable=nuitka_plugin # 一些由 nuitka 提供的插件,比如:qt-plugin
--include-plugin-directory=plugin_dir # 指定一些 Nuitka 无法预测的目录
--module some_module.py # 编译成额外的模块
--follow-import-to=src_dir # 需要编译成 C++ 代码的文件夹,使用 , 分隔
--output-dir=uut # 指定输出路径为 out
--windows-icon-from-ico=./logo.ico # 指定生成的 exe 文件的图标为 logo.ico 文件
--windows-disable-console # 取消 exe 弹框,增加则不再弹出命令行窗口

利用上面的命令就可以将工具打包成对应的 exe 文件,但是在执行过程中还需要一些第三方包的,将对应的包复制到 .dist 目录下即可。

总结

打包的过程不是特别快,可能是机器的性能不行,编译一个简单的项目大概需要 40 分钟,而且编译完的包并不特别下,有可能是因为打包的命令不对,后面再到新的机器上试用一下。

查看了一下,可以安装 orderedset 包来提高编译的速度,但是因为使用的是 Python 3.8 版本,这个包已经不再支持了。