【问题标题】:PyInstaller with Pandas creates over 500 MB exe带有 Pandas 的 PyInstaller 创建超过 500 MB 的 exe
【发布时间】:2017-10-08 18:26:40
【问题描述】:

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

import pandas as pd
print('hello world')

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

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

附:同时,我的同事从相同的示例脚本创建了一个 exe,最终不到 100 MB,不同之处在于他没有使用 anaconda。会是这样吗?

任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas anaconda conda pyinstaller


    【解决方案1】:

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

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

    我通过 conda 包获得了 203MB 的可执行文件,通过 pip 包获得了 30MB 的可执行文件。但是 conda 是纯 virtualenv 的一个很好的替代品。我可以使用 conda 和 Jupyter 进行开发,创建一些 mycode.py(我可以将 jupyter notebook 作为 py 文件下载到 myfolder 中)。但我的最终解决方案是下一个: 如果没有,请安装 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”的地方,pypiwin32 需要 pyinstaller 但不会自动安装,hook-pandas.py 需要用 pandas 编译。 此外,导入子模块并不能帮助我优化可执行文件的大小。 所以我不需要这个东西:

    from pandas import DataFrame as df
    

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

    import pandas as pd
    

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

    【讨论】:

    • 非常感谢,这使我的 600+ mb dist 文件夹增加到 80MB!我进一步从github.com/upx/upx/releases 下载了UPX,并将文件夹路径提供为--upx-dir=C:\upx394w,它进一步减少了28MB。所以,600MB 到 28MB。不错!
    • 向 conda 提交了关于此的问题:github.com/conda-forge/numpy-feedstock/issues/84
    • 为仍然想使用 conda 安装软件包的人们提供了一个建议:使用 conda install -c conda-forge numpy 来避免 mkl,它将使用 OpenBLAS 软件包代替它。这也被推荐用于发行版,因为 mkl 不是完全开放的许可证。见github.com/conda-forge/numpy-feedstock/issues/84
    • @rhaskett ok.. 请在github.com/conda-forge/pandas-feedstock/issues 上提交请求,然后向他们询问在没有 mkl 的情况下安装 pandas 的方法。参考我在此处链接的 numpy 问题。如果这也失败了,那么就按照这个答案的建议使用pip
    • 没什么大不了的,但我认为我遗漏了一些明显的东西。
    【解决方案2】:

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

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

    【讨论】:

    • 我在考虑virtualenv,你有没有在使用virtualenv 时构建exe 的经验?
    • 前段时间我在寻找自己的构建和exe,但我无法让它轻松工作,与非python同事分享我拥有的东西变得不那么紧迫,所以只有负面.但由于当时的其他优先事项,我并没有投入太多精力
    • 知道了,不幸的是我必须共享脚本并且为每个用户安装 python 环境是不可能的。叹息我可能会试一试 virtualenv
    • 告诉我们进展如何。我仍然对此感兴趣,但目前没有太多时间
    • 我对神秘的mkl 包进行了深入研究,并预感它被 conda 意外包含在内。它甚至不是一个免费的许可证包,在 pypi 上没有任何描述。我已就此向 conda 提出问题:github.com/conda-forge/numpy-feedstock/issues/84
    【解决方案3】:

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

    避免mkl,使用OpenBLAS 包代替它。 完整的解释在this issue at conda/conda-forge/numpy-feedstock github repo

    【讨论】:

    • 这应该是公认的答案,另见link
    • 这仍然包括 mkl 包
    • @erotavlas 太糟糕了。也许其他人在github.com/conda-forge/numpy-feedstock/issues/84 上发布的其他解决方案之一可以提供帮助?
    • @NikhilVJ 我在我的 conda 环境中使用 pip install 解决了这个问题 我猜 conda 版本包括 mkl 而不是 openblas
    • @erotavlas 这仍然包括 mkl 包 应该没有,您能提供更多信息吗? 我在 conda 环境中使用 pip install 后解决了这个问题 请注意,在 Conda 环境中使用 pip 有其怪癖。 我猜 conda 版本包含 mkl 而不是 openblas Conda 只是一个包管理器,没有“conda 版本”之类的东西。
    【解决方案4】:

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

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

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

    -运行 pyinstaller。

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

    【讨论】:

    • 这已经有一段时间没有必要了。
    【解决方案5】:

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

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

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

      python -m venv C:/Python/NewEnv
      

    这会在 C:/Python/NewEnv 中创建一个虚拟环境,其中包含基本 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 命令创建规范文件,但如果有,则宁愿这样做 - 参见 amendment#1)

    在新创建的 .spec 文件中会有一个隐藏的导入行:

        hiddenimports=[],
    

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

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

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

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

    修正#1:我发现可以将 hook-pandas.py 添加到 Pyinstaller 钩子中。 所以在新环境中安装完pyinstaller后,运行

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

    【讨论】:

    • 如果您已经在使用 Conda,为什么要切换到 venv 环境...?
    【解决方案6】:

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

    在 Windows 终端预览中的 Windows Power Shell 中,我安装了所有必要的库(例如 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/,但在我看来,这个库非常困难,至少对我来说是这样。

    【讨论】:

      【解决方案7】:

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

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      【解决方案8】:

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

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

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

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

      【讨论】:

      • 你好,你可以通过创建虚拟环境来达到同样的效果,我完全同意我们希望尽可能减少包数!
      • 说 Anaconda 提供了这么多无用的软件包是一种强有力的语言。如果你想要一个最小的环境,那么你应该使用 miniconda,或者从 Anaconda 创建你自己的最小环境并从那里开始:以conda create -n minipy37 python=3.7 为例。
      • 你需要纯 python 环境,没有 Anaconda。 这不是唯一的两个选择,例如 Miniconda。
      猜你喜欢
      • 2020-08-07
      • 2013-08-22
      • 1970-01-01
      • 2016-06-05
      • 2022-08-18
      • 2017-10-30
      • 2019-06-16
      • 2021-01-12
      • 1970-01-01
      相关资源
      最近更新 更多