一个命令行小工具用 PyInstaller 打出来 412MB,dist 目录里 numpy、pandas 的 dll 都在。实际代码只用了 requests 和一个内部工具包。乍看像缓存或者权限的锅,追下去往往不是。
pyinstaller --onefile --exclude-module pandas --exclude-module matplotlib app.py python -m venv cleanenv cleanenv/Scripts/pip install -r requirements-run.txt
追下去是这么回事:递归收集依赖时,某个包在 import 阶段就把重依赖带进来,PyInstaller 按引用全量收。装的时候多装的 extras 和开发依赖也会一起进包。
碰到「PyInstaller 体积」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
具体做法是,用 --exclude-module 排除确认不用的包 先排 matplotlib 和 pandas;建一个干净虚拟环境只装运行必需依赖 再打包对比体积;看 build 目录下的 warn 和 xref 文件 确认大文件是哪个包带进来的;能外置的数据文件不要打进单文件模式。
验收就看一点,产物从 412MB 降到 60MB 以内 启动后核心命令仍能正常执行。
