侧边栏壁纸
博主头像
M的小站

记录问题、证据与可复现的解决过程

  • 累计撰写 15 篇文章
  • 累计创建 36 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

PyInstaller 发布包:体积、启动速度与可诊断性

PyInstaller 发布包:体积、启动速度与可诊断性

把 Python 工具打成一个 exe 很容易,把它变成能长期交付的产品则完全不同。那版蓝牙工具的安装包超过 300 MB,旧电脑冷启动接近十秒,出现崩溃时用户只能发来一句“点了没反应”。优化目标因此不是追求最小数字,而是让发布包可复现、启动可测量、问题可诊断。

先知道谁被打进来了

用构建日志和依赖图检查隐藏导入,发现数据分析库通过一个可选功能被整体带入,而界面框架又捆绑了未使用的插件。删除依赖前先在干净虚拟环境运行测试,避免把“本机已有模块”误当成必需项。

spec 文件进入版本控制,明确列出数据文件、动态库、排除项和版本资源。构建机每次创建新环境并锁定依赖,不在开发环境里直接打包。发布目录同时生成 SHA-256 和构建清单。

onefile 并不总是更好

单文件模式便于发送,却需要启动时解压,杀毒扫描也会放大延迟。最终正式版选择 onedir,外层再制作安装包;便携测试版才使用 onefile。用户感知的是安装与启动是否可靠,而不是资源管理器里只有一个文件。

启动路径通过时间点拆分:进程创建、配置读取、主窗口出现、蓝牙后端就绪。结果显示图表和导出模块在首页就被导入,占了主要时间。改为真正使用功能时延迟导入,主窗口先展示,后台再探测适配器。

from time import perf_counter
T0 = perf_counter()
# 每个阶段记录 elapsed,而不是只打印“启动完成”

可诊断性要默认存在

应用启动即创建会话编号,日志按日期滚动,保留最近七天。未捕获异常会写入崩溃报告,包括应用版本、系统版本、操作阶段和脱敏后的堆栈。界面提供“导出诊断包”,用户无需寻找隐藏目录。

配置文件使用 schema 版本,升级时先备份再迁移;迁移失败会回到只读安全模式,而不是让应用直接退出。动态库加载错误被转换成明确提示,列出架构和缺失组件。

发布前检查

  • [x] 在无 Python 的全新虚拟机安装与启动
  • [x] 比较冷启动、热启动和首次蓝牙扫描耗时
  • [x] 断网、无蓝牙、无管理员权限均有可理解提示
  • [x] 升级保留配置,降级不会破坏原文件
  • [x] 卸载后用户数据按选择保留或清除
  • [x] 每个发布物包含版本信息、校验值和变更记录
  • [x] 崩溃报告可由界面一键导出

最终取舍

清理依赖后包体显著下降,延迟导入让窗口更早出现,但我没有为了数字删除诊断组件。对桌面工具而言,多几兆日志与证书支持远比“极限瘦身”重要。发布工程的标准也不该是“我的电脑能打开”,而是陌生环境可安装、失败时说得清、下一版本可以平稳接住上一版本的数据。

0

评论区