一次真实的 Kimi Code 打包实践

Python 程序写完之后,打包往往才是另一场工作的开始。

Nuitka 的功能很强大,但面对 onefile、standalone、模块递归导入、Tcl/Tk 数据、Windows 运行库以及各种裁剪参数,想得到一个既能运行又尽量精简的产物,通常需要反复查资料、修改命令和验证。

这次,我把这个任务交给了 Kimi Code。

我没有逐条告诉它应该添加什么参数,只提出了目标:

随后,Kimi Code 在项目目录中完成了从分析到交付的整个过程。

Kimi Code 实际做了什么

Kimi Code 确认项目使用的是:

  • tkinter 和 tkwebui 界面;
  • pymem 内存读写;
  • Nuitka 编译;
  • Tcl/Tk 运行资源;
  • 做一轮模块和数据裁剪。

并保留了适合当前项目的精简参数:

  • 使用 LTO;
  • 删除 docstrings 和 asserts;
  • 排除未使用的 Python 模块;
  • 裁剪 tkwebui 的模块和导入;
  • 删除不需要的 Tcl/Tk 数据;
  • Tcl 编码只保留 ASCII、CP1252、CP936 和 ISO-8859-1;
  • 保留 Windows 所需运行库。

最后输出完整运行目录。

3. 真正执行构建,而不是只给一段命令

Kimi Code 不只是写出脚本,还实际运行了 Nuitka 构建。

构建成功后得到:

  • standalone 目录总大小约 17.2 MiB;
  • 主程序约 6996 KiB;
  • onefile 版本约 5.8 MiB。

构建完成后,它还实际启动了 standalone 中的 EXE,确认进程没有提前退出,主窗口能够正常创建。

这一点很重要:AI 交付的不是一段“理论上可以”的命令,而是一个已经执行并做过启动验证的产物。

4. 继续回答“为什么这么大”

看到主 EXE 有 6996 KiB,我自然产生了疑问:一个界面并不复杂的程序,为什么需要这么大的 EXE?

Kimi Code 没有停留在“这是运行库开销”这种笼统解释,而是直接检查 PE 文件结构,得到:

区域 约合大小 主要内容
.text 2.13 MiB 编译后的机器码
.rdata 4.61 MiB 常量和只读数据
其他区域 几十 KiB 可写数据、异常处理、资源和重定位信息

这说明体积大头不是机器码,而是 .rdata。

继续扫描后,又找到了 tkinter、encodings、difflib、trace、zipfile、sysconfig、subprocess、pymem、tkwebui 等模块的常量、名称、模板和错误文本。

于是一个模糊的“文件很大”变成了可以分析的具体问题:

standalone 递归纳入了多个 Python 模块,Nuitka 将这些模块的常量和元数据编译进主程序;onefile 更小,则主要因为它进行了压缩。

AI 改变的不只是写命令的速度

过去做精简打包,常见流程是:

  1. 搜索 Nuitka 参数;
  2. 复制一段命令;
  3. 构建失败后再搜索错误;
  4. 成功启动后再逐个删除文件;
  5. 发现某个功能异常,再恢复依赖;
  6. 反复比较文件大小。

Kimi Code 可以把这些步骤串起来:

  • 阅读现有脚本;
  • 理解项目依赖;
  • 修改构建配置;
  • 执行完整构建;
  • 检查输出目录;
  • 启动程序验证;
  • 分析二进制体积;
  • 将命令、结论和后续优化方向整理成文档。

也就是说,它承担的是一整条工程流程,而不只是一个“命令生成器”。

这个活以后可以交给 AI 了

对于这类目标明确、结果可以验证的任务,我已经可以放心地把它交给 AI:

把这个 Python 项目用 Nuitka 打成精简 standalone,保留原构建方式,完成后实际构建并验证启动,同时解释产物体积。

相比“帮我写一条 Nuitka 命令”,这种任务描述更完整,也更适合 Kimi Code 发挥。

AI 可以负责繁琐的分析和执行,人则负责提出目标与验收要求:

  • 要 onefile 还是 standalone;
  • 是否允许启动时自解压;
  • 更重视体积还是启动方式;
  • 是否必须兼容没有 Python 的电脑;
  • 哪些功能必须逐项验证。

也需要保留的边界

“交给 AI”不等于省略所有验收。

尤其是精简打包,排除模块可能只影响某个较少使用的功能。程序能启动,并不代表所有功能都经过了验证。

因此,合理的分工是:

  • AI 完成构建、裁剪、启动验证和体积分析;
  • 开发者补充游戏内或业务场景的功能测试;
  • 每次新增排除参数后,都重新验证相关功能。

结语

这次实践最让我满意的,不只是得到了一个约 17.2 MiB 的 standalone 目录和一个5.9MB onefile,而是整个问题终于有了完整的处理链条:

从构建脚本,到实际产物;从启动验证,到 PE 段分析;从体积疑问,到可以继续执行的优化方向。

Nuitka 精简打包这种需要查参数、改脚本、跑构建、看结果的活,以后确实可以交给 Kimi Code 了。

人只需要说清楚想要什么,并负责最后的业务验收。