告别臃肿PySide6应用打包exe后我是如何手动‘瘦身’到15M的附完整文件清单每次用PyInstaller打包PySide6应用时看着生成的exe文件体积直奔100M而去那种感觉就像看着自己的代码突然长出了啤酒肚。作为一个对软件分发体积有强迫症的开发者我花了整整两周时间研究如何在不影响功能的前提下把记事本应用从110M精简到最终安装包仅15M。这个过程就像给程序做了一场精准的抽脂手术——不是简单粗暴的压缩而是找到那些真正用不到的依赖项逐个剔除。1. 为什么PySide6打包后体积如此臃肿PySide6作为Qt的Python绑定默认会包含Qt框架的完整功能集。就像你去超市买一把剪刀结果商家给了你一个包含开瓶器、指甲锉等20种功能的瑞士军刀。PyInstaller在打包时出于保险起见会把所有可能用到的Qt模块都包含进来核心图形库Qt6Core.dll、Qt6Gui.dll等基础模块网络功能Qt6Network.dll及相关插件多媒体支持Qt6Multimedia.dll翻译文件translations目录下的所有语言包平台插件styles、platforms等目录下的各种渲染引擎更麻烦的是这些依赖还存在级联效应。比如当你保留一个图像格式插件时它可能又依赖了其他十几个库文件。我的记事本应用明明只需要基本的文本编辑功能最终打包却带上了虚拟键盘、PDF渲染这些完全用不到的功能。2. 常规精简方法为何失效在决定手动删除文件前我尝试了所有主流精简方案但都有明显缺陷方法效果缺点UPX压缩体积减少30%-40%启动速度下降50%以上杀毒软件误报率高虚拟环境打包体积减少10%-15%对PySide6无效依然包含全部Qt模块spec文件exclude体积减少5%-10%需要精确知道模块名效果有限Nuitka编译体积减少20%-30%编译时间长兼容性问题多最让我无法接受的是UPX压缩——那个引以为傲的0.3秒启动速度压缩后变成了令人抓狂的1.5秒。作为一款需要频繁启动的记事本工具这种体验退化绝对不可接受。3. 手术刀式手动精简实战3.1 准备工作首先确保你的开发环境可以稳定复现打包过程。我推荐使用以下目录结构project/ ├── src/ # 源代码 ├── dist/ # PyInstaller输出 ├── build/ # 临时构建文件 └── venv/ # 虚拟环境关键命令记录# 使用-D模式打包生成目录而非单文件 pyinstaller -D -w --iconapp.ico src/main.py # 进入生成的dist目录 cd dist/main/_internal3.2 安全删除清单经过反复测试以下文件在基础文本编辑应用中完全可以删除核心目录文件libcrypto-3.dll # SSL加密库无网络功能时可删 Qt6Network.dll # 网络功能模块 Qt6OpenGL.dll # OpenGL支持 Qt6Pdf.dll # PDF渲染 Qt6VirtualKeyboard.dll # 虚拟键盘plugins目录精简方案platforms/ ├── qdirect2d.dll # Direct2D渲染保留qwindows.dll即可 ├── qminimal.dll # 最小化渲染 └── qoffscreen.dll # 无界面渲染 styles/ └── *.dll # 所有样式表如需保留基础样式可只留qwindowsvistastyle.dll imageformats/ ├── qsvg.dll # SVG支持 ├── qpdf.dll # PDF预览 └── qwebp.dll # WebP格式translations目录# 非中文用户只需保留自己需要的语言包 rm -rf translations/qtbase_*.qm rm -rf translations/qt_*.qm重要提示删除前请先将文件重命名为.bak进行测试确认功能正常后再永久删除。我曾在删除unicodedata.pyd后遭遇中文显示异常的问题。3.3 文件删除自动化脚本手动操作容易出错我最终编写了这个批处理脚本自动执行精简echo off set DIST_DIRdist\main\_internal :: 删除无用核心文件 del %DIST_DIR%\libcrypto-3.dll del %DIST_DIR%\Qt6Network.dll :: 清理plugins目录 del %DIST_DIR%\PySide6\plugins\platforms\qdirect2d.dll del %DIST_DIR%\PySide6\plugins\imageformats\qwebp.dll :: 移除所有翻译文件保留中文 del %DIST_DIR%\PySide6\translations\qtbase_*.qm del %DIST_DIR%\PySide6\translations\qt_*.qm copy %DIST_DIR%\PySide6\translations\qtbase_zh_CN.qm . echo 精简完成原大小110M现大小46M4. 安装包极致压缩技巧即使经过上述处理直接打包仍有46M。通过Inno Setup的压缩优化最终安装包可以控制在15M以内关键配置参数[Setup] Compressionlzma2/ultra64 SolidCompressionyes LZMAUseSeparateProcessyes LZMABlockSize65536实测不同压缩算法效果对比压缩方式安装包大小安装耗时无压缩46MB3秒zip32MB5秒lzma228MB8秒lzma2/ultra6415MB12秒这个记事本应用经过三轮优化后不仅体积缩小到原来的13%启动速度还保持在0.3秒的水平。用户反馈安装包下载时间从原来的2分钟降到20秒这在网络条件较差的地区体验提升尤为明显。
告别臃肿!PySide6应用打包exe后,我是如何手动‘瘦身’到15M的(附完整文件清单)
发布时间:2026/5/20 21:35:14
告别臃肿PySide6应用打包exe后我是如何手动‘瘦身’到15M的附完整文件清单每次用PyInstaller打包PySide6应用时看着生成的exe文件体积直奔100M而去那种感觉就像看着自己的代码突然长出了啤酒肚。作为一个对软件分发体积有强迫症的开发者我花了整整两周时间研究如何在不影响功能的前提下把记事本应用从110M精简到最终安装包仅15M。这个过程就像给程序做了一场精准的抽脂手术——不是简单粗暴的压缩而是找到那些真正用不到的依赖项逐个剔除。1. 为什么PySide6打包后体积如此臃肿PySide6作为Qt的Python绑定默认会包含Qt框架的完整功能集。就像你去超市买一把剪刀结果商家给了你一个包含开瓶器、指甲锉等20种功能的瑞士军刀。PyInstaller在打包时出于保险起见会把所有可能用到的Qt模块都包含进来核心图形库Qt6Core.dll、Qt6Gui.dll等基础模块网络功能Qt6Network.dll及相关插件多媒体支持Qt6Multimedia.dll翻译文件translations目录下的所有语言包平台插件styles、platforms等目录下的各种渲染引擎更麻烦的是这些依赖还存在级联效应。比如当你保留一个图像格式插件时它可能又依赖了其他十几个库文件。我的记事本应用明明只需要基本的文本编辑功能最终打包却带上了虚拟键盘、PDF渲染这些完全用不到的功能。2. 常规精简方法为何失效在决定手动删除文件前我尝试了所有主流精简方案但都有明显缺陷方法效果缺点UPX压缩体积减少30%-40%启动速度下降50%以上杀毒软件误报率高虚拟环境打包体积减少10%-15%对PySide6无效依然包含全部Qt模块spec文件exclude体积减少5%-10%需要精确知道模块名效果有限Nuitka编译体积减少20%-30%编译时间长兼容性问题多最让我无法接受的是UPX压缩——那个引以为傲的0.3秒启动速度压缩后变成了令人抓狂的1.5秒。作为一款需要频繁启动的记事本工具这种体验退化绝对不可接受。3. 手术刀式手动精简实战3.1 准备工作首先确保你的开发环境可以稳定复现打包过程。我推荐使用以下目录结构project/ ├── src/ # 源代码 ├── dist/ # PyInstaller输出 ├── build/ # 临时构建文件 └── venv/ # 虚拟环境关键命令记录# 使用-D模式打包生成目录而非单文件 pyinstaller -D -w --iconapp.ico src/main.py # 进入生成的dist目录 cd dist/main/_internal3.2 安全删除清单经过反复测试以下文件在基础文本编辑应用中完全可以删除核心目录文件libcrypto-3.dll # SSL加密库无网络功能时可删 Qt6Network.dll # 网络功能模块 Qt6OpenGL.dll # OpenGL支持 Qt6Pdf.dll # PDF渲染 Qt6VirtualKeyboard.dll # 虚拟键盘plugins目录精简方案platforms/ ├── qdirect2d.dll # Direct2D渲染保留qwindows.dll即可 ├── qminimal.dll # 最小化渲染 └── qoffscreen.dll # 无界面渲染 styles/ └── *.dll # 所有样式表如需保留基础样式可只留qwindowsvistastyle.dll imageformats/ ├── qsvg.dll # SVG支持 ├── qpdf.dll # PDF预览 └── qwebp.dll # WebP格式translations目录# 非中文用户只需保留自己需要的语言包 rm -rf translations/qtbase_*.qm rm -rf translations/qt_*.qm重要提示删除前请先将文件重命名为.bak进行测试确认功能正常后再永久删除。我曾在删除unicodedata.pyd后遭遇中文显示异常的问题。3.3 文件删除自动化脚本手动操作容易出错我最终编写了这个批处理脚本自动执行精简echo off set DIST_DIRdist\main\_internal :: 删除无用核心文件 del %DIST_DIR%\libcrypto-3.dll del %DIST_DIR%\Qt6Network.dll :: 清理plugins目录 del %DIST_DIR%\PySide6\plugins\platforms\qdirect2d.dll del %DIST_DIR%\PySide6\plugins\imageformats\qwebp.dll :: 移除所有翻译文件保留中文 del %DIST_DIR%\PySide6\translations\qtbase_*.qm del %DIST_DIR%\PySide6\translations\qt_*.qm copy %DIST_DIR%\PySide6\translations\qtbase_zh_CN.qm . echo 精简完成原大小110M现大小46M4. 安装包极致压缩技巧即使经过上述处理直接打包仍有46M。通过Inno Setup的压缩优化最终安装包可以控制在15M以内关键配置参数[Setup] Compressionlzma2/ultra64 SolidCompressionyes LZMAUseSeparateProcessyes LZMABlockSize65536实测不同压缩算法效果对比压缩方式安装包大小安装耗时无压缩46MB3秒zip32MB5秒lzma228MB8秒lzma2/ultra6415MB12秒这个记事本应用经过三轮优化后不仅体积缩小到原来的13%启动速度还保持在0.3秒的水平。用户反馈安装包下载时间从原来的2分钟降到20秒这在网络条件较差的地区体验提升尤为明显。