【已解决】pyinstaller打包瘦身,变小 exe 的通用和终极解决方案!

本文介绍如何通过UPX压缩和使用虚拟环境来减小大型PyQt项目的EXE文件大小,包括UPX压缩的配置、排除特定包、以及如何在虚拟环境中管理和安装依赖,使270M的exe文件减小至33M。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我通过下面的办法,成功将一个 270M 的 exe,降低到了 33M。下面分享给大家。参考目录。

如果你打包 PyQt 的项目,打包超过 100M ,那么铁定是可以更小的。
一般 PyQt界面也就是20-40M左右,图片多一张可以按照增加1M估算。

怎么把容量降下来?有通用方法和终极方案(一天包你瘦!成功了请点赞,没成功请留言骂我,谢谢!)。

1.UPX 压缩

UPX 是 pyinstaller 里默认会去查找到一种压缩功能。使用 UPX 可以让 exe 被压缩一次,变得更小。是一种通用的方式,只是少有人用起来。包瘦的!
打包命令:

pyinstaller main.spec 

UPX 一般是不可用的,打包日志可见:
提示UPX不可用
默认是没有安装 UPX 的。
但 main.spec 里面是默认会查找 UPX 功能:

    upx=True,
    upx_exclude=[],

upx_exclude 的作用是排除一些我们不希望被压缩进去的包。

UPX 下载:https://upx.github.io

解压后只需要复制其中的 upx.exe 存放到 pyinstaller.exe 所在目录即可。

一般在 script 目录:
在这里插入图片描述
再次运行命令:
在这里插入图片描述
凭借这个技巧 ,我成功让一个 270M的包,减少到了261M,整整少了9M!,好吧,很看运气。你就说瘦没瘦吧。。。

2. 失败方案:明确 import 内容(这个不要学)

这是我自作聪明的办法,引以为戒。
我将import整个库的代码

import openxyxl

全部改为具体的方法


from openpyxl import load_workbook
...
load_workbook('../xx.xlsx')

不仅修改代码,我还清空了缓存。删除了 build 文件夹和 _pycache_ 缓存文件夹。

然而并没有用,exe还是一样大,一个bit都没少。

理论上这个方案应起作用的,可能因为用的是 Anaconda 环境的原因,导致内部的包还是被关联了进来。

3.虚拟环境(划重点!)。

虚拟环境就是给这个项目单独配置一个新的纯净的python环境。

完全避免了环境中包含多余的包。(你也可以通过在原本环境直接卸载 pip uninstall 掉多余的包,但不建议这么做,毕竟其它项目还得做。。。)。

接下来详细说明在 windows 系统上的 pycharm 中设置虚拟环境,达到打包瘦身的全过程。

注:构造纯净的虚拟环境虽然可以降低容量,但是操作稍复杂,如果完全小白,遇到问题评论区留言,我两天内会看到。如果你对环境变量,pip 安装有一定了解,肯定没问题。

1.配置虚拟环境

虚拟环境可以避免 Anaconda 环境影响,也能避免对全局环境的删改影响别的项目的环境。虚拟环境 yyds!
希望大家都学会配置虚拟环境,毕竟以后还要开发很多项目。

a.安装虚拟环境工具

virtualenv 是一个专门用来安装虚拟环境的第三方工具,我们先安装它。

在 pycharm 中打开 Terminal 终端,直接输入命令:

pip install virtualenv

安装能够创建虚拟环境的工具。

b.创建一个虚拟环境
virtualenv package_venv 

package_venv 是需要新建的虚拟环境存放目录,随意取名。可加个 venv 后缀表示虚拟环境,你要写成 “xxx" 也行。
此时,当前项目下(Terminal 当前指示的目录下)就会出现一个 package_venv 文件夹,里面的内容如下:
虚拟环境文件结构

Lib: 第三方库,会默认下载的包类似 : pip , setuptools , wheel
Scripts: 一些脚本。虚拟环境的激活,失效等脚本。

注:此时的命令依然是在全局环境下运行,所以安装的 python 版本来自环境变量 path 中设置的 python.exe 位置,我的版本为 python3.9,所以Lib 中的 python.exe 版本也是 3.9(复制来源)
你可以用 > python --version 命令查看当前版本,如果想要安装指定的python版本,参考:指定python版本安装虚拟环境

c. 激活虚拟环境
> cd package_venv\Scripts
> activate.bat

请注意,此时的命令行开头变了:
进入虚拟环境的标志
注意,有(pachage_venv) 标志在开头(虚拟环境文件夹名),才说明你进入了虚拟环境,可以为所欲为了。
再执行 pip install 命令都会安装在虚拟环境而不是你的全局环境中。
(若激活失败,可参考 activate.bat执行后未进入虚拟环境

d.测试一下

保险起见,先测试一下虚拟环境里面有几个包:

pip list

所有包
只有三个包,整个 Lib 文件夹也只有 14.5M

e. 配置 pycharm

刚才我们创建了一个虚拟环境,只是刚好放在我的项目同级目录下而已。接下来,我们要让虚拟环境和pycharm发生关系。让 package_venv 为 pycharm 所用。

不消多说,settings 配置一下,然后 Edit configuration… 一下就行了。

1.settings:输入 interpreter 搜索:
在这里插入图片描述
点击 “+” 号,然后选择 Existing environment,默认就是刚才设置的 package_venv(没有你就找到它)。

于是,我们的解释器环境就变成了:
在这里插入图片描述
2. 配置中也改为虚拟环境目录的 python.exe
在这里插入图片描述

ok 以后,此时如果你再次运行项目,就会发现有了类似的报错:

ModuleNotFoundError: No module named ‘PyQt5’

因为我们的虚拟环境中现在,啥!包!也!没!有!要一个个装上。

2.安装包

小心!开始一个个安装包进来。盯着自己的 site-package,不能让她胖起来。

法一: 项目中维护了 requirement.txt 文件。
检查 requirements.txt 的包是否多余,尤其是 numpy,pands, SciPy 等,这些包每个至少 50M 以上。

cd ../../
pip install -r requirements.txt

法二:从每个代码文件开头找到 import 的包名,或者运行项目,缺啥就 install 啥。

我的做法是先用 法一,然后多余的包 pip unstall xxx,我只删掉了最大三个包:numpy,pands, scipy (这几个数算相关的占了上百M)。如果你代码中只是有一些小计算,替换为其它包吧。

我的安装包过程大致如下,requirements.txt 完了之后 site-package 文件夹有270M,删除上面三个包剩下34M,然后安装了 PyQt5,容量到了181M。(其实不删除多余包也未必就会打进去,但我还是先删除它们保险)

测试运行无报错。

3. 打包啦

激动人心的时刻终于来了。

我现在一共只有 181M 的第三方库,我就不信能打出 270M 来!果然:
33M
33M!啊,你敢信?!我测试了程序的功能,完全没毛病!

从270M到33M,做梦一般。

ps: 这里应该没有用上 UPX ,如果用上,估计还能少几M。

如果你也按照上面的方法压缩成功的话,就点个赞吧。如果有哪个步骤不清楚的,可以留言。

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值