环境要求:Windows,Pyinstaller 6.3.0 (不是这个版本的话,请逐步校对以下我在运行过程中的截图)
本文所使用代码不开源,觉得本文的思路可行的话,请加?QQ - 1398173074?购买 (¥30,注明来意):
本文所使用的代码基于标准库 os、pathlib,共 130 行,包含一个名为 Installer 的类。有排查 exe 冗余依赖文件的函数 dump_exclude,有修改 .spec 文件的函数 modify_spec,提供源代码修改指引的函数 check_src。
该代码附有使用示例,如版本不兼容则要求使用者一定的代码能力,因本人学业繁忙不能帮忙调试,购买前请三思。
使用 pyinstaller -D 打包会生成一个 exe 和一个文件夹 _internal
使用 pyinstaller -F 打包则会生成一个 exe
但实际上,这个 exe 相当于 exe 和 _internal 的压缩包
在每次运行的时候,这个 exe 会解压到临时目录的一个文件夹中
而这个文件夹的内容与 _internal 文件夹是一致的,故可以研究 _internal 文件夹中的冗余内容,进而对 pyinstaller -F 打包的 exe 进行瘦身
如果会点英文的话,会发现 _internal 中其实有很多 .dll、.pyd 是不会用到的,但是一个一个删太慢了,有什么效率高的方法吗?
利用动态库加载时机 (聪明的同学自行操作,省省钱),便可以快速地得到不需要的文件列表,并写入 exclude.txt 中
接下来的难题就是,如何告诉 pyinstaller 我们不需要这些依赖文件
运行 pyinstaller -F 生成 .spec 文件
这个文件实际上是一个 python 文件,看看第一行就知道了
在 .spec 文件中添加以下代码
EXE 是 pyinstaller 源代码中的一个类,my_exclude 是我们自定义的类属性,通过这个方法,要排除的文件列表就成功传送到 pyinstaller 的源代码中了
接着就是修改 pyinstaller 的源代码,首先找到 api.py 所在文件
在指定位置添加以下代码
运行 pyinstaller *.spec 即可完成打包
除修改源代码之外,本文的打包流程如下:
瘦身前 (107 MB):
瘦身后 (66 MB)