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打包后文件大小差异巨大的原因是什么?
一般建议在 virtualenv 下打包,只导入需要的模块即可
核心原因是打包时引入了不同环境中的依赖,尤其是通过 pip 或 conda 安装的包可能包含大量非必要的元数据、测试文件或平台特定的二进制文件。
举个例子,如果你在基础环境用 pip install pandas,在另一个环境用 conda install pandas,Conda 可能会包含更多优化过的、但体积更大的依赖项或额外的动态链接库。PyInstaller 会把这些依赖都打包进去,导致最终的可执行文件大小不同。
要解决这个问题,最直接的方法是创建一个干净的虚拟环境,只安装程序运行必需的最小依赖,然后再用 PyInstaller 打包。你可以用 pip list 或 pip 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 稳多了 建议楼主尝试

