python 使用 pyinstaller 打包模块命令打包出来的exe文件太大了怎么办?
问题描述——pyinstaller
打包出来的exe文件太大了怎么办?
运行打包命令
问题原因
为什么使用 pyinstaller
打包这么大,因为他把一些不必要的包给打包进去了
解决方法
如果解决这个打包文件太大的问题,可以使用一个工具进行压缩,或者用其它打包的库
第一个方法:使用工具库压缩
upx压缩
查找资料的过程中,在他人博客发现了一个可以打包压缩的工具:
详细的介绍自己去网站上看,简单概括一下就是(内容来自百度词条):
具体使用起来十分方便,首先,去官网下载对应版本的upx文件:
点击这个下载
或者使用这个下载地址,复制到浏览器上面下载:
下载完成后将其放在我们需要打包的py文件所在的目录:
解压后:
把里面的exe程序放到要打包py文件下
然后运行如下命令就ok啦:
这里禁用vcruntime140.dll的原因是参考了这里:
最终打包的效果如下:
发现体积确实是被压缩了,不过压缩的很小
为了打包时候体积更加小,可以在打包文件
我们可以修改刚刚运行打包命令时生成的:
你可以在第十三行添加你认为打包过程中不需要的包,这样pyinstaller在打包的过程中就不会再使用这些包了。重新运行一下命令:
2.使用虚拟环境 降低打包过程中打包一些不必要的环境进入exe程序里面
显然,一个最直接的想法是新建一个虚拟环境,里面只装我们需要的py包,这样打包过程中就不会搞进去一些没用的py包了。首先,我们安装一下pipenv这个包,方便我们创建虚拟环境:
然后执行如下命令建立虚拟环境:
效果如下:
接着执行如下命令进入虚拟环境:
效果如下:
安装运行我们程序所需要的依赖包:
以及打包我们程序所需要的依赖包:
然后,重新运行一下我们的打包命令:
第二个方法:使用其它打包库
Nuitka的安装及使用
2 nuitka的安装
- 直接利用pip即可安装:pip install Nuitka
- 下载vs2019(MSVS)或者MinGW64,反正都是C++的编译器,随便下。如果电脑有这个环境可以不用下载,可以先试试下面打包命令,如果不能打包就要安装这个环境
如上
3使用过程
先介绍打包简单的exe程序命令:
打包时候有点久,等
打包完成,发现exe运行不了
并且体积也没有减少多少
打包后的exe是运行不了的,要去这里需要找到这些包(我的是在software\python3.7\Lib\site-packages下)复制(比如numpy,cv2这个文件夹)到demo.dist路径下
打包深度学习和机器学习一些库多的py的时候,用下面方法,生成exe有自己指定图表
对于第三方依赖包较多的项目(比如需要import torch,tensorflow,cv2,numpy,pandas,geopy等等)而言,这里最好打包的方式是只将属于自己的代码转成C++,不管这些大型的第三方包!
以下是我demo的一个目录结构(这里使用了pytq5框架写的界面):
使用以下命令(调试)直接生成exe文件:
这里简单介绍下我上面的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的编译之后,你就能在你的目录下看到:
当然这里你会发现真正运行exe的时候,会报错:no module named torch,cv2,tensorflow等等这些没有转成C++的第三方包。
这里需要找到这些包(我的是在software\python3.7\Lib\site-packages下)复制(比如numpy,cv2这个文件夹)到demo.dist路径下。
总得来说,还是pyinstaller打包好,虽然打包体积大,但是可以压缩
问题解决,