天天看点

python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?

python 使用 pyinstaller 打包模块命令打包出来的exe文件太大了怎么办?

问题描述——​

​pyinstaller​

​ 打包出来的exe文件太大了怎么办?

运行打包命令

pyinstaller -F naughtyconfession.py -w  #不把音乐,字体,图片等文件打包进exe文件,并且在终端执行      
python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?

问题原因

为什么使用 ​

​pyinstaller​

​打包这么大,因为他把一些不必要的包给打包进去了

解决方法

如果解决这个打包文件太大的问题,可以使用一个工具进行压缩,或者用其它打包的库

第一个方法:使用工具库压缩

upx压缩

查找资料的过程中,在他人博客发现了一个可以打包压缩的工具:

https://github.com/upx/upx      

详细的介绍自己去网站上看,简单概括一下就是(内容来自百度词条):

UPX (the Ultimate Packer for eXecutables)
是一款先进的可执行程序文件压缩器,压缩过的可执行文件体积缩小50%-70% ,
这样减少了磁盘占用空间、网络上传下载的时间和其它分布以及存储费用。
通过 UPX 压缩过的程序和程序库完全没有功能损失和压缩之前一样可正常地运行,
对于支持的大多数格式没有运行时间或内存的不利后果。 
12345      

具体使用起来十分方便,首先,去官网下载对应版本的upx文件:

https://github.com/upx/upx/releases/tag/v3.96      
python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?

点击这个下载

或者使用这个下载地址,复制到浏览器上面下载:

https://github.com/upx/upx/releases/download/v3.96/upx-3.96-win64.zip      
python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?

下载完成后将其放在我们需要打包的py文件所在的目录:

解压后:

python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?

把里面的exe程序放到要打包py文件下

python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?

然后运行如下命令就ok啦:

pyinstaller -F 123.py -w --upx-exclude=vcruntime140.dll      

这里禁用vcruntime140.dll的原因是参考了这里:

https://github.com/pyinstaller/pyinstaller/issues/1565
1      

最终打包的效果如下:

python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?
python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?

发现体积确实是被压缩了,不过压缩的很小

为了打包时候体积更加小,可以在打包文件

我们可以修改刚刚运行打包命令时生成的:

python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?
python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?
python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?

你可以在第十三行添加你认为打包过程中不需要的包,这样pyinstaller在打包的过程中就不会再使用这些包了。重新运行一下命令:

pyinstaller -F 123.spec
注意这次是123.spec而不是123.py啦!!!      

2.使用虚拟环境 降低打包过程中打包一些不必要的环境进入exe程序里面

显然,一个最直接的想法是新建一个虚拟环境,里面只装我们需要的py包,这样打包过程中就不会搞进去一些没用的py包了。首先,我们安装一下pipenv这个包,方便我们创建虚拟环境:

pip install pipenv      
python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?

然后执行如下命令建立虚拟环境:

pipenv install      

效果如下:

python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?

接着执行如下命令进入虚拟环境:

pipenv shell      

效果如下:

python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?

安装运行我们程序所需要的依赖包:

pip install pygame      

以及打包我们程序所需要的依赖包:

pip install pyinstaller      

然后,重新运行一下我们的打包命令:

pyinstaller -F 123.py -w      

第二个方法:使用其它打包库

Nuitka的安装及使用

2 nuitka的安装

  • 直接利用pip即可安装:pip install Nuitka
  • 下载​​vs2019​​(MSVS)或者MinGW64,反正都是C++的编译器,随便下。如果电脑有这个环境可以不用下载,可以先试试下面打包命令,如果不能打包就要安装这个环境

    如上

python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?

3使用过程

先介绍打包简单的exe程序命令:

nuitka --standalone --show-memory --show-progress   123.py      
python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?
python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?

打包时候有点久,等

打包完成,发现exe运行不了

python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?

并且体积也没有减少多少

python 使用 `pyinstaller` 打包模块命令打包出来的exe文件太大了怎么办?

打包后的exe是运行不了的,要去这里需要找到这些包(我的是在software\python3.7\Lib\site-packages下)复制(比如numpy,cv2这个文件夹)到demo.dist路径下

打包深度学习和机器学习一些库多的py的时候,用下面方法,生成exe有自己指定图表

对于第三方依赖包较多的项目(比如需要import torch,tensorflow,cv2,numpy,pandas,​​geopy​​等等)而言,这里最好打包的方式是只将属于自己的代码转成C++,不管这些大型的第三方包!

以下是我demo的一个目录结构(这里使用了pytq5框架写的界面):

├─utils//源码1文件夹├─src//源码2文件夹├─logo.ico//demo的图标└─demo.py//main文件      

使用以下命令(调试)直接生成exe文件:

nuitka --standalone --show-memory --show-progress --nofollow-imports --plugin-enable=qt-plugins --follow-import-to=utils,src --output-dir=out --windows-icon-from-ico=./logo.ico demo.py      

这里简单介绍下我上面的nuitka的命令:

  • –standalone:方便移植到其他机器,不用再安装python
  • –show-memory --show-progress:展示整个安装的进度过程
  • –nofollow-imports:不编译代码中所有的import,比如​​keras​​,numpy之类的。
  • –plugin-enable=qt-plugins:我这里用到​​pyqt5​​来做界面的,这里nuitka有其对应的插件。
  • –follow-import-to=utils,src:需要编译成C++代码的指定的2个包含源码的文件夹,这里用,来进行分隔。
  • –output-dir=out:指定输出的结果路径为out。
  • –windows-icon-from-ico=./logo.ico:指定生成的exe的图标为logo.ico这个图标,这里推荐一个将图片转成ico格式文件的网站(比特虫)。
  • –windows-disable-console:运行exe取消弹框。这里没有放上去是因为我们还需要调试,可能哪里还有问题之类的。

经过1min的编译之后,你就能在你的目录下看到:

├─utils//源码1文件夹├─src//源码2文件夹├─out//生成的exe文件夹
    ├─demo.build 
    └─demo.dist
        └─demo.exe//生成的exe文件├─logo.ico//demo的图标└─demo.py//main文件      

当然这里你会发现真正运行exe的时候,会报错:no module named torch,cv2,tensorflow等等这些没有转成C++的第三方包。

这里需要找到这些包(我的是在software\python3.7\Lib\site-packages下)复制(比如numpy,cv2这个文件夹)到demo.dist路径下。