摘要:精心编写的 Python 脚本,用 PyInstaller 打包成 exe 后,体积动不动就几十 MB 甚至上百 MB!给客户发个工具,光传文件就得等半天;放到 GitHub 上分享,下载量直接被体积劝退……
精心编写的 Python 脚本,用 PyInstaller 打包成 exe 后,体积动不动就几十 MB 甚至上百 MB!给客户发个工具,光传文件就得等半天;放到 GitHub 上分享,下载量直接被体积劝退……
我自己就曾用 PyQt5 写了一个桌面工具,打包后体积高达 180MB!
这背后的原因,其实是 Python 打包的 “原罪”——PyInstaller 会把整个 Python 解释器、所有依赖库一股脑塞进 exe 里。你只是想带瓶水出门,结果被迫扛了一整箱矿泉水上路。
直到我发现了 upx(Ultimate Packer for eXecutables),这个问题才迎刃而解。
简单来说,UPX 是一款专为可执行文件设计的压缩工具。它就像一个 “文件裁缝”,能在不破坏程序功能的前提下,把 exe 文件的体积大幅压缩。
看看官方数据:平均压缩率 50%-70%!也就是说,100MB 的文件,压缩后可能只有 30-50MB。
UPX 采用独特的压缩算法,直接对 exe 文件中的代码和资源进行压缩。当程序运行时,UPX 会在内存中自动解压,整个过程对用户完全透明。
更神奇的是,压缩后的程序运行速度几乎不受影响!因为解压过程是在内存中瞬间完成的,用户根本感觉不到延迟。
轻量级:无需复杂配置,解压即用跨平台:支持 Windows、Linux、macOS下面以 Windows 系统为例,手把手教你用 UPX 压缩 Python 打包的 exe 文件。
安装 PyInstaller:如果你还没安装,先在命令行输入:pip install pyinstaller下载 UPX:从 UPX 官网(https://upx.github.io/)下载最新版本。目前最新版本是 3.08,解压后得到一个文件夹,里面包含 upx.exe。假设你的脚本名为myapp.py,先使用 PyInstaller 打包:
pyinstaller -F -w myapp.py-F:打包成单个 exe 文件-w:隐藏命令行窗口(适合 GUI 程序)打包完成后,会在dist文件夹生成一个体积较大的 exe 文件。
将下载的 UPX 文件夹中的upx.exe复制到dist文件夹。然后在命令行进入dist目录,执行压缩命令:
upx --best myapp.exe--best:使用最高压缩级别,耗时可能较长,但压缩率最大压缩完成后,你会发现myapp.exe的体积大幅减小!以我的一个程序为例:
压缩前:53MB压缩后:26MB体积直接砍半!
如果你不想把 UPX 复制到dist文件夹,可以在 PyInstaller 命令中指定路径:
pyinstaller -F -w --upx-dir "C:\Tools\UPX" myapp.py如果程序包含大量 dll 文件,压缩这些文件可能效果不明显,还会拖慢启动速度。可以只压缩主 exe 文件:
upx --exclude "*.dll" --best myapp.exe使用虚拟环境打包,避免把系统环境中的多余库打包进去。例如:
python -m venv myenvsource myenv/bin/activate # Linux/macOSmyenv\Scripts\activate # Windowspip install pyinstallerpyinstaller -F -w myapp.py四、效果对比程序类型压缩前体积压缩后体积压缩率简单 GUI 工具48MB22MB54%数据处理脚本120MB45MB62.5%游戏辅助工具210MB78MB62.9%从数据可以看出,UPX 对不同类型的 Python 程序都有显著的压缩效果。
原因:PyInstaller 找不到 UPX 路径原因:可能是某些依赖库不兼容 UPX 压缩尝试使用--noupx参数禁用 UPX 压缩检查是否遗漏了必要的 dll 文件原因:UPX 常被恶意软件用来加壳,导致杀毒软件误判原因:UPX 在内存中解压需要时间通过使用 UPX,我们可以在一定程度上解决 Python 打包体积过大的问题。它不仅能大幅减小文件体积,还能保持程序的完整性和运行效率。
当然,UPX 并不是万能的。在实际使用中,还需要结合虚拟环境、排除不必要的依赖等方法,才能达到最佳效果。
来源:旦莫