做Python开发的人大多遇到过同一个麻烦:代码写完了想分享,卡在打包这一步。要么打包报错,要么生成的exe文件体积巨大,还有的会卡在打包界面半小时没动静。一位自称主要活跃在二三线城市物联网方向的开发者卡卡,把这类困扰做成了具体的解决方案——他推出了名为 kkpack 的打包库,号称只需一条命令就能得到一个「瘦身版」可分发的程序。

与nuitka正面对比:体积差距有多大
据卡卡的演示,在双方都调用 numpy 的同一场景下,他把 nuitka 与 kkpack 产出的文件做了体积对照。原文给出的示例程序中使用了 multiprocessing 创建子进程,子进程和主进程分别打印运行状态,主程序里还构建了一个 numpy 数组。对比结果显示两者差距明显,kkpack 产物远小于 nuitka 产物。原文标题给出的量级是「200MB秒变10MB」,即体积从数百兆级别压到十兆级别。
nuitka的打包流程与国内安装的坑
为公平对照,卡卡也给出了 nuitka 的完整用法:先执行 pip install nuitka,再用 python -m nuitka --mingw64 --standalone --output-dir=output main.py 完成打包。他提醒,如果机器上没有装 MinGW64,首次执行命令时会被询问是否安装,回复 Yes 即可自动安装。但在国内下载速度很慢,建议提前手动下载后放进 nuitka 对应目录。他给出的镜像地址是 https://mirror4.lzu.edu.cn/github-release/brechtsanders/winlibs_mingw/,落盘的目录为 C:\Users\xxxx\AppData\Local\Nuitka\Nuitka\Cache\downloads\gcc\x86_64。

kkpack的两步用法
换到 kkpack 就简单得多。第一步同样是装库:pip install kkpack;第二步直接运行 kkpack main.py。无需额外参数,也无需配置编译器,一条命令即可完成打包,这正是自称「脑洞开发者」的卡卡想要的效果。
体积为何能压这么小:依赖改为首次运行下载
kkpack 产物之所以小,关键在打包策略与传统方案不同。kkpack 生成的 exe 在第一次被运行时,才会去判断依赖是否已经存在,缺失的依赖那时才下载安装;依赖装完后再运行就不必重复下载,只有首次启动需要联网补齐。同时,kkpack 只把开发者的源码以及 Python 运行所必需的环境纳入打包范围,其他内容一概不封装。卡卡认为这就是 kkpack 的核心思路,也顺带避免了因第三方库过于复杂而导致打包失败的问题。

动机:Pyside + pyqtgraph让他回回打包失败
卡卡在文中提到,打包始终是他最头疼的一环。尤其在处理 Pyside 项目搭配 pyqtgraph 时,用 nuitka 几乎每次都以失败告终,而只要涉及打包就要耗掉半天时间。正因如此,他选择从根源上重新做打包工具,于是有了 kkpack,希望这一类需求的开发者能从中受益。
小结:据开发者卡卡介绍,kkpack 通过「只打包源码与Python环境、第三方依赖改由exe首次运行时下载」的策略,把含 numpy 的程序体积从nuitka方案的数百兆降到十兆量级,打包只需 pip install kkpack 加 kkpack main.py 两条命令。对长期被绑定依赖、打包失败与体积臃肿困住的 Python 桌面项目来说,这是一条用运行时下载换体积与成功率的新思路,实际效果仍以具体项目验证为准。
