继上一篇文章打包后,发现包太大了,我们现在开始进行瘦身优化。
本项目的所有演示代码:github可在这里下载。
打包只用的工具为PyInstaller
。
不想细看的朋友 可以直接跳到 最后 方法对比
查看瘦身结果比较。~~
下图中,我们可以看到,我们只是简单的添加了两个ui文件,包大小就显示有98.5 MB
。完全不可理解。
进入exe同级目录后发现,主要控件贡献最大的是 Qt的各种ui库,占了80%的内存。目前自己测试了,优化有效的方法有三种加一种失败的方法。
打包成单文件,顾名思义就是把所有的dll等库和依赖都打包到exe文件里面去。
我们通过 pyinstaller -h
可以看到,有这么个命令 -F
, 默认是-D
-D, --onedir Create a one-folder bundle containing an executable
(default)
-F, --onefile Create a one-file bundled executable.
好的,将我们的打包命令修改为:
pyinstaller -w -F pymain.py --add-data="formmain.ui;."
(packenv) C:\Users\Administrator\Documents\PyDemo>pyinstaller -w -F pymain.py --add-data="formmain.ui;."
71 INFO: PyInstaller: 4.5.1
71 INFO: Python: 3.6.7
72 INFO: Platform: Windows-10-10.0.19041-SP0
79 INFO: wrote C:\Users\Administrator\Documents\PyDemo\pymain.spec
82 INFO: UPX is not available.
82 INFO: Extending PYTHONPATH with paths
['C:\\Users\\Administrator\\Documents\\PyDemo',
'C:\\Users\\Administrator\\Documents\\PyDemo']
......
10811 INFO: Updating manifest in C:\Users\Administrator\Documents\PyDemo\build\pymain\runw.exe.e4rzbi26
10812 INFO: Updating resource type 24 name 1 language 0
10818 INFO: Appending archive to EXE C:\Users\Administrator\Documents\PyDemo\dist\pymain.exe
18313 INFO: Building EXE from EXE-00.toc completed successfully.
打包成功后,进入dist
目录查看只有pymain.exe
一个文件,显示大小为39.4M
双击,可以运行,但是发现启动速度稍微慢了一点点。
除了打包成单个文件外,我们还可以借助压缩工具将我们的依赖库进一步进行压缩。
首先去官网进行下载并解压。
我们将解压后文件夹放入随便一个本地地址,如C:\upx-3.96-win64
。
PyInstaller
打包默认是开了UPX
压缩的,我们可以从打包的log – 82 INFO: UPX is not available.
或者 .spec - upx=True,
文件里面发现。下面介绍两种进行压缩的命令方法
我们使用--upx-dir
命令,并且后面接的地址为upx的文件夹地址,不是exe地址。
pyinstaller -w pymain.py --add-data="formmain.ui;." --upx-dir="C:\upx-3.96-win64"
可以看到下面log里面的upx也变更为了167 INFO: UPX is available.
(packenv) C:\Users\Administrator\Documents\PyDemo>pyinstaller -w pymain.py --add-data="formmain.ui;." --upx-dir="C:\upx-3.96-win64"
71 INFO: PyInstaller: 4.5.1
71 INFO: Python: 3.6.7
73 INFO: Platform: Windows-10-10.0.19041-SP0
75 INFO: wrote C:\Users\Administrator\Documents\PyDemo\pymain.spec
167 INFO: UPX is available.
......
766 INFO: checking COLLECT
3396 INFO: Building COLLECT COLLECT-00.toc
4184 INFO: Building COLLECT COLLECT-00.toc completed successfully.
查看dist
的大小为44.2M
, 运行起来发现启动速度稍微慢了一点点。
将本地的C:\upx-3.96-win64
添加到环境变量并生效后。
重新运行命令
pyinstaller -w pymain.py --add-data="formmain.ui;."
或者运行
pyinstaller pymain.spec
都可以,生成的dist
大小同样为为44.2M
。
添加到环境变量后方便一下,不用每次都赋值地址。
我们将第二章的UPX添加到环境变量后,再次运行打包单文件的命令试试。
pyinstaller -w -F pymain.py --add-data="formmain.ui;."
输出
(packenv) C:\Users\Administrator\Documents\PyDemo>pyinstaller -w -F pymain.py --add-data="formmain.ui;."
72 INFO: PyInstaller: 4.5.1
72 INFO: Python: 3.6.7
73 INFO: Platform: Windows-10-10.0.19041-SP0
75 INFO: wrote C:\Users\Administrator\Documents\PyDemo\pymain.spec
162 INFO: UPX is available.
163 INFO: Extending PYTHONPATH with paths
......
8771 INFO: Appending archive to EXE C:\Users\Administrator\Documents\PyDemo\dist\pymain.exe
15165 INFO: Building EXE from EXE-00.toc completed successfully.
然后我们惊喜的发现,生成的pymain.exe
大小仅有31M
。
速度比前两个稍微更慢一点点。
在第二章upx压缩后确实发现,qt将所有有用无用的依赖库都加进来了,然而想要删除部分无用的依赖库后,运行exe,报依赖缺失的弹窗。
其他参考网站说可以删除,但是测试失败。不知道是哪个步骤不对。
方法 | 大小 | 启动速度 | 结论 |
---|---|---|---|
多文件不压缩默认 | 98.5M | 最快 | 默认选项 |
单文件不压缩 | 39.4M | 速度比较快 | 适合小工程,只生成一个文件。不能查看依赖库 |
多文件UPX压缩 | 44.2M | 速度有点慢 | 多文件适合大工程,但是启动速度比较慢 |
单文件UPX压缩 | 31M | 速度有点慢 | 只有一个文件,包最小,启动速度也比较慢 |
多文件UPX压缩(删除无用依赖) | — | — | 测试失败,移除任何依赖都无法运行 |
综述:
其他章节:
Pyside2 学习系列一:创建包含ui文件的项目 (超详细的Pyside2 攻略)
Pyside2 学习系列二:PyInstaller打包项目exe (超详细的Pyside2 攻略)
Pyside2 学习系列三:PyInstaller打包项目瘦身(超详细的Pyside2 攻略)