Pyside2 学习系列三:PyInstaller打包项目瘦身(超详细的Pyside2 攻略)

继上一篇文章打包后,发现包太大了,我们现在开始进行瘦身优化。
本项目的所有演示代码:github可在这里下载。
打包只用的工具为PyInstaller

不想细看的朋友 可以直接跳到 最后 方法对比 查看瘦身结果比较。~~

优化

  • 1 简单查看包构成
  • 2 瘦身方法
    • 2.1 打包成单文件
    • 2.2 UPX压缩
      • 2.2.1 命令行添加地址
      • 2.2.2 将UPX路径添加到环境变量
    • 2.3 打包成单文件并UPX压缩
    • 2.4 打包成多文件后,删除无用的依赖库(未成功)
  • 3 方法对比

1 简单查看包构成

下图中,我们可以看到,我们只是简单的添加了两个ui文件,包大小就显示有98.5 MB。完全不可理解。

Pyside2 学习系列三:PyInstaller打包项目瘦身(超详细的Pyside2 攻略)_第1张图片
进入exe同级目录后发现,主要控件贡献最大的是 Qt的各种ui库,占了80%的内存。目前自己测试了,优化有效的方法有三种加一种失败的方法。

2 瘦身方法

2.1 打包成单文件

打包成单文件,顾名思义就是把所有的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
Pyside2 学习系列三:PyInstaller打包项目瘦身(超详细的Pyside2 攻略)_第2张图片
双击,可以运行,但是发现启动速度稍微慢了一点点。

2.2 UPX压缩

除了打包成单个文件外,我们还可以借助压缩工具将我们的依赖库进一步进行压缩。
首先去官网进行下载并解压。
我们将解压后文件夹放入随便一个本地地址,如C:\upx-3.96-win64

PyInstaller 打包默认是开了UPX压缩的,我们可以从打包的log – 82 INFO: UPX is not available. 或者 .spec - upx=True,文件里面发现。下面介绍两种进行压缩的命令方法

2.2.1 命令行添加地址

我们使用--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, 运行起来发现启动速度稍微慢了一点点。

2.2.2 将UPX路径添加到环境变量

将本地的C:\upx-3.96-win64添加到环境变量并生效后。
重新运行命令

pyinstaller -w pymain.py --add-data="formmain.ui;."

或者运行

pyinstaller pymain.spec

都可以,生成的dist大小同样为为44.2M
添加到环境变量后方便一下,不用每次都赋值地址。

2.3 打包成单文件并UPX压缩

我们将第二章的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
速度比前两个稍微更慢一点点。

2.4 打包成多文件后,删除无用的依赖库(未成功)

在第二章upx压缩后确实发现,qt将所有有用无用的依赖库都加进来了,然而想要删除部分无用的依赖库后,运行exe,报依赖缺失的弹窗。
其他参考网站说可以删除,但是测试失败。不知道是哪个步骤不对。

3 方法对比

方法 大小 启动速度 结论
多文件不压缩默认 98.5M 最快 默认选项
单文件不压缩 39.4M 速度比较快 适合小工程,只生成一个文件。不能查看依赖库
多文件UPX压缩 44.2M 速度有点慢 多文件适合大工程,但是启动速度比较慢
单文件UPX压缩 31M 速度有点慢 只有一个文件,包最小,启动速度也比较慢
多文件UPX压缩(删除无用依赖) 测试失败,移除任何依赖都无法运行

综述

  • 包占用最多的是qt的ui库的依赖
  • 各种压缩方法都有优缺点,需要结合项目实际使用。

其他章节:
Pyside2 学习系列一:创建包含ui文件的项目 (超详细的Pyside2 攻略)
Pyside2 学习系列二:PyInstaller打包项目exe (超详细的Pyside2 攻略)
Pyside2 学习系列三:PyInstaller打包项目瘦身(超详细的Pyside2 攻略)

你可能感兴趣的:(Python,Qt,qt,windows,python)