使用 Pandas 的 PyInstaller 创建超过 500 MB 的 exe

PyInstaller with Pandas creates over 500 MB exe

我尝试使用 PyInstaller 3.2.1 创建一个 exe 文件,出于测试目的,我尝试为以下代码制作一个 exe:

import pandas as pd
print('hello world')

经过相当长的时间(15 分钟以上),我完成了 620 MB 大小的 dist 文件夹并构建了 150 MB。我使用 Python 3.5.2 |Anaconda 自定义(64 位)在 Windows 上工作。可能值得注意的是,在 dist 文件夹中,mkl 文件占近 300 MB。 我 运行 pyinstaller 使用 'pyinstaller.exe foo.py'。我尝试使用 --exclude-module 来排除一些依赖项,但最终还是得到了巨大的文件。无论我使用 onefile 还是 onedir 都没有任何区别。

我知道 exe 必须包含一些重要文件,但是大约 1 GB 这么大是否正常?如有必要,我可以提供警告日志或任何可能有助于解决问题的信息。

P.S。与此同时,我的同事从同一个示例脚本创建了一个 exe,结果不到 100 MB,不同之处在于他没有使用 anaconda。会不会是这个原因?

任何帮助将不胜感激。

这可能是因为 numpy 的 Anaconda 版本是使用 mkl 构建的。

如果您想减小可分发文件的大小,您可以使用单独的建筑 virtual environment 并通过 pip 而不是 conda

安装软件包

PyInstaller 从 conda 包创建一个大的可执行文件,从 pip 包创建一个小的可执行文件。从这个简单的 python 代码:

from pandas import DataFrame as df
print('h')

我使用 conda 包获得了一个 203MB 的可执行文件,使用 pip 包获得了一个 30MB 的可执行文件。但是 conda 是纯 virtualenv 的一个很好的替代品。我可以使用 conda 和 Jupyter 进行开发,创建一些脚本 'mycode.py'(我可以在我的文件夹中将 Jupyter 笔记本下载为 py-file)。

但我的最终解决方案是:如果没有,请安装 Miniconda 并从 Windows 开始菜单打开 Anaconda Prompt;

    cd myfolder
    conda create -n exe python=3
    activate exe
    pip install pandas pyinstaller pypiwin32
    echo hiddenimports = ['pandas._libs.tslibs.timedeltas'] > %CONDA_PREFIX%\Lib\site-packages\PyInstaller\hooks\hook-pandas.py
    pyinstaller -F mycode.py

在我创建新环境'exe'的地方,pyinstaller 需要pypiwin32 但不会自动安装,需要hook-pandas.py 用pandas 编译。此外,导入子模块并不能帮助我优化可执行文件的大小。所以我不需要这个东西:

from pandas import DataFrame as df

但我可以使用通常的代码:

import pandas as pd

此外,在路径中使用国家字母时可能会出现一些错误,因此开发工具最好使用英文用户帐户。

你需要纯净的 python 环境,没有 Anaconda。

因为,它的无用包太多了。 在另一台 PC 上使用尽可能少的软件包安装新的 python 环境!

然后再尝试使用pyinstaller。通过这种方法,pyinstaller 将文件从 200M 减少到 8M。

PS: 如果你缺少一些包,你可以 pip install ...

这是一种仍然使用 conda 并避免使用 mkl 的方法。在使用此备用命令安装 pandas 之前安装 numpy:
conda install -c conda-forge numpy

避免 mkl,使用 OpenBLAS 包代替。 this issue at conda/conda-forge/numpy-feedstock github repo.

中的完整解释

我在 Windows 10 上为 Python 构建了 Anaconda 3.5.5,并且还使用 Anaconda 发行版获得了过大的可执行文件。

我可以通过执行以下操作来更正此问题:

  1. 首先创建一个虚拟环境(论坛建议使用virtualenv,但这给我带来了问题所以我改用了venv)

    python -m venv C:/Python/NewEnv
    

这会在 C:/Python/NewEnv 中创建一个虚拟环境,其中包含 base python、pip 和 setuptools

  1. 接下来切换到新建的环境

    C:/Python/NewEnv/Scripts/activate
    

您会知道环境有所不同,因为您的命令提示符将以您的新环境名称 (NewEnv) 开头

  1. 先安装numpy,然后scipy,然后pandas

    pip install numpy==1.13.3
    pip install scipy==1.1.0
    pip install pandas==0.18.1
    pip install pypiwin32==223
    pip install pyinstaller==3.2
    

我不得不使用这些版本,因为我尝试了不同的版本,但是 pandas 的任何更高版本都给我带来了更多问题。

  1. 一旦这些都安装好了,你就可以编译你的程序了

    C:/Python/NewEnv/Scripts/pyinstaller --onefile program.py
    
  2. 这将创建一个 .spec 文件,您需要使用此版本的 pandas 和 pyinstaller 修改该文件以添加隐藏的导入,否则将从可执行文件加载 pandas会失败(不确定是否有一个 pyinstaller 命令来创建规范文件,但如果有那么宁愿这样做 - 参见修正案#1)

新建的.spec文件中会有一个隐藏的imports行:

    hiddenimports=[],

更改此以添加 pandas._libs.tslibs.timedeltas

    hiddenimports=['pandas._libs.tslibs.timedeltas'],
  1. 然后您可以针对 .spec 文件再次编译您的程序

    C:/Python/NewEnv/Scripts/pyinstaller --onefile program.spec
    

请注意,这会将程序安装在您所在的任何目录中,因此请在执行 pyinstaller 之前更改目录。

Ammendmend#1:我看到可以将 hook-pandas.py 添加到 Pyinstaller 挂钩。 所以你在新环境安装pyinstaller后,运行

    echo hiddenimports = ['pandas._libs.tslibs.timedeltas'] > C:\Python\NewEnv\Lib\site-packages\PyInstaller\hooks\hook-pandas.py

使用 Anaconda 时的一个简单解决方案:

-在 Anaconda Navigator 中创建一个新环境。 (新环境没有导致问题的大量软件包。)

-打开一个终端并使用 pipinstall 来包含你需要的包。 (确保是新环境)

-运行 py 安装程序。

我将我的 .exe 从 300 MB 减少到 30 MB。

我遇到了类似的问题并找到了解决方案。 我使用 Windows 终端预览。该程序允许创建各种虚拟环境,例如 Windows Power Shell(顺便说一句。Linux Ubuntu。另外,值得注意的是:您可以在该程序中安装许多终端,并且,甚至,一次打开几个。很酷的东西)。

Inside Windows Power Shell in Windows terminal preview 我安装了所有必要的库(例如 re、pandas、numpy 等),然后我打开我的文件路径并尝试使用此命令:

pyinstaller --onefile -w 'filename.py'

...但是,输出 exe 无效。出于某种原因,控制台说缺少一个库(我之前安装过)。我找到了模仿 auto-py-to-exe 库的解决方案。此 GUI 使用的命令是:

pyinstaller --noconfirm --onedir --console "C:/Users/something/filename.py"

而且这个效果很好。 我将输出 exe 程序的大小从 911MB 减少到 82.9MB !!!

顺便说一句。 911MB 是 auto-py-to-exe.

输出的大小

我想知道怎么可能还没有人创建一个压缩器来读取代码,检查哪些库是代码的一部分,然后只将它们放入压缩中。在我的例子中,auto-py-to-exe 可能加载了我安装过的所有库。这将解释这个压缩文件夹的大小。

有人建议使用 https://virtualenv.pypa.io/en/stable/ 但在我看来,这个库非常难,至少对我来说是这样。

我在虚拟环境中创建了一个可执行文件。它无助于减小应用程序的大小。根据已关闭的问题 QST: Pandas without MKL?,'pandas 不直接使用 mkl,您的问题与 pyinstaller 有关。' 然后我尝试使用 py2app(Windows 的 py2exe)制作一个独立的应用程序。因此,该应用占用 156 MB,而使用 pyinstaller 时占用 923 MB。