Python中不同环境下使用pyinstaller打包后文件大小差异巨大的原因是什么?

小弟新手,对于 pyinstaller 打包的原理不是非常清楚,最近写了个操作 excel 的小脚本,需要打包分发。
我的机器 A 上,环境是 python3.6 的官方包,用 pyinstaller 打包成的 dist 目录是 约 19M 大小,可以接受。
但是在机器 B 上,环境是 anaconda3, 一样的脚本,用 pyinstaller 打包成的 dist 目录是 700 多 M !吓死人了- -
机器 B 下 700M 的 dist 目录里占用最多的是一堆 mkl_开头的 dll,不认识不知道是什么鬼- - 如 mkl_core.dll ,mkl_avx2.dll 这些就 500 多 M 了,
还有 pyqt 的一些,这些我都用不到的啊,为什么要给我打进去?

pyinstaller 打包命令用的都是一样的命令,都未加任何选项。pyinstaller test.py

test.py 里导入的包有:
import re
import xlwings as xw
import string
import sys
import os.path

都只有一个 xlwings 第三方模块。

求大神 科普一下。不胜感激!
Python中不同环境下使用pyinstaller打包后文件大小差异巨大的原因是什么?


13 回复

一般建议在 virtualenv 下打包,只导入需要的模块即可


核心原因是打包时引入了不同环境中的依赖,尤其是通过 pipconda 安装的包可能包含大量非必要的元数据、测试文件或平台特定的二进制文件。

举个例子,如果你在基础环境用 pip install pandas,在另一个环境用 conda install pandas,Conda 可能会包含更多优化过的、但体积更大的依赖项或额外的动态链接库。PyInstaller 会把这些依赖都打包进去,导致最终的可执行文件大小不同。

要解决这个问题,最直接的方法是创建一个干净的虚拟环境,只安装程序运行必需的最小依赖,然后再用 PyInstaller 打包。你可以用 pip listpip freeze 对比两个环境的包列表,找出差异。

总结:用最小依赖的干净环境打包。

以及最后生成导出的话都会加个参数 -F , 这样只会生成一个二进制文件在 dist 目录下

谢谢! virtualenv 下次再好好研究研究。
能否科普一下打包的原理吗?为什么直接在 anaconda 的环境下,这么多东西会打包进去?

-F 生成单个文件 这个我知道 不过 就算这样 单个文件也有近 300M。而且单个文件启动会慢一点。

mkl 库 一般用于 numpy 之类的科学计算环境

估计是 anaconda 链接了不少不需要的库和包吧
可以用 pyinstaller options script.spec 查看下依赖项

嗯对是会慢, 我那脚本跑起来就一直运行了到没太注意…

环境还是 docker 控制下比较清真…

我前段时间也在 conda 下打包过一次,而且还 import 了 pandas 这种巨大的库,用-F 选项压出来才 30M。

貌似 conda 会把环境包都打进去? conda list 查看是否有 pyqt.

感觉就是把 anaconda 下有的包都打进去了,楼上哥们说的 numpy pyqt 这些都是 anaconda 自带的。

Virtualenv 稳多了 建议楼主尝试

回到顶部