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

时间:2024-10-20 08:16:20

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

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

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

压缩

打包命令:

pyinstaller  

UPX 一般是不可用的:
提示UPX不可用
因为默认是没有安装 UPX 的。
但是 里面是默认会查找的:

    upx=True,
    upx_exclude=[],

upx_exclude 的作用排除一些特殊的包,如果你不希望这些包被压缩的话。

UPX 下载:

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

一般在 script 目录:
在这里插入图片描述
再次运行命令:
在这里插入图片描述
凭借这个技巧 ,我成功让一个 270M的包,减少到了261M,整整少了9M!,好吧,确实,很看运气。光靠压缩达不到理想效果。

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

这是我自作聪明的办法,引以为戒。
我将类似

import openxyxl

全部改为具体的方法


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

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

然而并没有用,最终的exe连1个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 中设置的 位置,我的版本为 python3.9,所以Lib 中的 版本也是 3.9(复制来源)
你可以用 > python --version 命令查看当前版本,如果想要安装指定的python版本,参考:指定python版本安装虚拟环境

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

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

d.测试一下

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

pip list

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

e. 配置 pycharm

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

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

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

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

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

ModuleNotFoundError: No module named ‘PyQt5’

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

2.安装包

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

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

cd ../../
pip install -r 

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

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

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

测试运行无报错。

3. 打包啦

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

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

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

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

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