【Python】告别臃肿:PyInstaller + UPX 极致瘦身打包实战(2024版)

张开发
2026/4/17 18:31:02 15 分钟阅读

分享文章

【Python】告别臃肿:PyInstaller + UPX 极致瘦身打包实战(2024版)
1. 为什么你的Python打包文件像个胖子每次用PyInstaller打包完Python程序看着生成的exe文件体积是不是有种这真的是我的代码吗的错觉特别是用Anaconda这类集成环境打包时动辄几百MB的体积简直让人崩溃。我去年给客户交付一个数据清洗工具时原始代码才300KB打包后居然有280MB客户还以为我偷偷塞了个游戏进去。问题根源主要在两个方面第一是Python环境本身携带了大量不必要的依赖库就像搬家时把整个小区都打包带走第二是PyInstaller默认打包方式会把所有可能用到的库都包含进去生怕漏掉什么。我做过对比测试同一个脚本在Anaconda下打包是287MB而在纯净Python环境只要43MB - 这差距够装下10个《俄罗斯方块》游戏了。提示千万别在Anaconda环境下直接打包就像你不会穿着羽绒服去夏威夷度假2. 打造极致瘦身的健身套餐2.1 准备纯净的Python环境首先得给你的代码找个健身房 - 一个干净的Python环境。推荐直接从官网下载安装包我习惯用3.9版本稳定性经过验证。安装时记得勾选Add Python to PATH这样后面操作会方便很多。安装完成后建议先升级pip到最新版python -m pip install --upgrade pip然后用清华镜像源安装必要库速度飞快pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple2.2 PyInstaller的瘦身参数详解PyInstaller有组神奇的参数组合我管它叫瘦身三剑客pyinstaller -F -w -i app.ico main.py-F把所有东西打包成单个exe文件比文件夹形式体积小-w去掉命令行窗口适合GUI程序-i给exe加个漂亮图标但这样还不够我们还需要祭出大杀器...3. UPX - 打包界的抽脂机UPX是个开源的可执行文件压缩工具能把exe体积再砍掉30%-70%。最新版下载地址https://github.com/upx/upx/releases下载解压后打包时加上--upx-dir参数指向UPX目录pyinstaller -F -w -i app.ico main.py --upx-dir D:\upx-3.96-win64实测一个数据分析工具打包效果原始打包156MB使用UPX后89MB纯净环境UPX52MB4. 进阶瘦身技巧大公开4.1 依赖库的断舍离用pip-autoremove工具清理未使用的依赖pip install pip-autoremove pip-autoremove pandas -y4.2 动态链接库优化在spec文件中添加排除列表excluded_binaries [libopenblas.*, qt5.*]4.3 资源文件压缩对图片等资源使用tinypng压缩后再打包# 在代码中动态加载压缩后的资源 with open(compressed.png, rb) as f: img_data f.read()5. 完整实战案例演示假设我们要打包一个使用Pandas的CSV处理工具创建虚拟环境python -m venv slim_env slim_env\Scripts\activate仅安装必要库pip install pandas pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple编写打包脚本pyinstaller -F -w -i data.ico csv_tool.py --upx-dir D:\upx-3.96-win64 --exclude-module matplotlib最终一个包含Pandas的工具从原来的220MB降到了68MB启动速度还快了40%6. 常见问题与解决方案QUPX压缩后杀毒软件报毒A这是UPX的常见现象可以尝试更换UPX版本打包完成后用数字签名工具签名在杀毒软件中添加信任Q打包后程序无法运行A按这个顺序检查先用-D参数测试文件夹模式检查控制台报错信息用--debug参数生成调试版本Q如何进一步减小体积A终极方案是用Nuitka转C再编译使用PyOxidizer打包考虑用Cython重写性能关键部分7. 我的踩坑日记去年给某银行做自动化报表工具时客户要求exe必须小于50MB。我试了各种方法先用Anaconda打包 - 320MB直接被拒换纯净环境 - 110MB还是太大加上UPX - 75MB接近了最后发现是PyQt5的依赖问题改用tkinter - 终于压到48MB关键教训是GUI库选择对体积影响巨大。现在我的首选方案是简单界面用tkinter中等复杂度用PySimpleGUI必须用PyQt时开启--exclude-module剔除不需要的组件

更多文章