目录

使用Nuitka打包Python代码

工作中碰到这样一个场景,N个不同的文件要邮件分别发送给N个部门。

之前因为仅仅是个人使用,所以在Excel里通过VBA来实现,最近听同事说他们也有这类需求,便想着把自己写的小工具分享给他们。但单位统一装的是WPS,兼容性存在一定问题,亦或者遇到宏被禁用却不知道降低宏安全性的情况,着实比较麻烦。

于是抽时间写了一个Python的版本,调试一切正常后,接下来就是打包发布了。N年前试用过 PyInstaller 打包,打包后文件比较大,启动也比较慢,体验不是很好,这次准备试试Nuitka

准备工作

以下步骤基于Windows平台

  1. 新建一个虚拟环境,安装Python程序所需要的库(过程略)
  2. 安装 Nutika,在虚拟环境下执行 pip install nuitka,安装完成后,可以执行 nuitka --version 查看版本号
  3. (可选)手工安装 Nutika 依赖,并添加环境变量
Nuitka依赖

以下三个工具如缺失,编译时会提示下载,输入 Yes 则自动下载并放在 C:\Users\用户名\AppData\Local\Nuitka\Nuitka 文件夹下

  • ccache:自动或手动下载至 C:\Users\用户名\AppData\Local\Nuitka\Nuitka\v4.6 文件夹下,v4.6 为版本号,后续可能会变
  • depends:自动或手动下载至 C:\Users\用户名\AppData\Local\Nuitka\Nuitka\depends\x86_64 文件夹下
  • gcc:自动下载至 C:\Users\用户名\AppData\Local\Nuitka\Nuitka 文件夹下。或手动下载最新的Win64 UCRT runtime 版(名称如:winlibs-x86_64-posix-seh-gcc-版本号-llvm-版本号-mingw-w64ucrt-版本号),并将解压后的目录(如:D:\mingw64\bin)添加到环境变量

参数说明

在虚拟环境中执行 nuitka -hnuitka --help可以查看 Nuitka 的参数说明,以下列出常用的参数。

建议
调试时不要添加 --windows-disable-console 参数,用于显示命令窗口,方便运行报错时查找报错原因,调试完成后发布时再加上。

一般编译参数

  • --mingw64:默认为已经安装的vs2017去编译,否则就按指定的比如mingw(官方建议)
  • --standalone:独立环境,这是必须的(否则拷给别人无法使用)
  • --onefile:像PyInstaller一样打包成单个exe文件
  • --windows-disable-console:运行时没有CMD控制窗口
  • --show-memory:显示编译时的内存占用
  • --show-progress:显示编译时的进度
  • --output-dir=out:指定编译输出结果的路径为out文件夹

模块控制参数

  • --nofollow-imports:不编译代码中所有的import
  • --nofollow-import-to=openpyxl,pandas:不编译指定的import,多个用 , 分隔
  • --follow-imports:编译代码中所有的import
  • --follow-import-to=need,src:指定需要编译的源码文件夹,多个文件夹用 , 分隔

插件控制参数

执行 nuitka --plugin-list 可以查看支持的插件

--enable-plugin=插件名称--plugin-enable=插件名称 :启用插件,默认为空 --disable-plugin=插件名称--plugin-disable=插件名称:禁用插件,默认为空

例:

  • --enable-plugin=tk-inter:打包Tkinter程序时
  • --enable-plugin=pyqt5:打包PyQt5程序时
  • --enable-plugin=pyside6:打包PySide6程序时
  • --enable-plugin=numpy:打包numpy模块时
  • --enable-plugin=torch: 打包pytorch的刚需
  • --enable-plugin=tensorflow:打包tensorflow的刚需

软件信息参数

  • --linux-onefile-icon=app.ico:Linux下的图标位置
  • --windows-icon-from-ico=app.ico:windows下软件的ico图标
  • --windows-company-name=:Windows下软件公司信息
  • --windows-product-name=:Windows下软件名称
  • --windows-file-version=:Windows下软件的信息
  • --windows-product-version=:Windows下软件的产品信息
  • --windows-file-description=:Windows下软件的作用描述
  • --windows-uac-admin=:Windows下用户可以使用管理员权限来安装

执行编译

在虚拟环境中,执行编译脚本。以下为我的Python小工具调试时的编译脚本,发布时加上 --windows-disable-console 禁用命令行窗口,供参考。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
nuitka --standalone --mingw64 \
--show-progress \
--enable-plugin=pyside6 \
--nofollow-import-to=openpyxl \
--windows-icon-from-ico=app.ico \
--windows-company-name="CrazyM" \
--windows-product-name="MailTools" \
--windows-file-description="邮件批量发送工具" \
--windows-product-version=0.4.1.0 \
--output-dir=out app.py

/posts/compile-python-code-with-nuitka/20221025.png
程序运行界面