Pyandstaller与Pandas创建超过500 MB的exe

问题描述 投票:7回答:7

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

import pandas as pd
print('hello world')

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

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

附:与此同时,我的同事从相同的示例脚本创建了一个exe,结果不到100 MB,不同的是他没有使用anaconda。这可能是事吗?

任何帮助将不胜感激。

python python-3.x pandas pyinstaller
7个回答
10
投票

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

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

我通过conda包获得203MB可执行文件,通过pip包获得30MB可执行文件。但康达是纯粹的virtualenv的好替代品。我可以用conda和Jupyter开发,创建一些mycode.py(我可以在myfolder中下载jupyter笔记本作为py文件)。但我的最终解决方案是:如果你没有它,安装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

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


7
投票

这可能是因为使用numpy构建的anaconda版mkl

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


5
投票

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

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


1
投票

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

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

然后再次尝试使用pyinstaller。使用此方法,pyinstaller将文件从200M减少到8M。

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


1
投票

我在Windows 10上使用了Anaconda 3.5.5 for Python,并且使用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

我不得不使用这些版本,因为我尝试了不同的版本,但任何后续版本的熊猫都给了我更多的问题。

  1. 安装完成后,即可编译程序 C:/Python/NewEnv/Scripts/pyinstaller --onefile program.py
  2. 这将创建一个.spec文件,您需要使用此版本的pandas和pyinstaller进行修改以添加隐藏的导入,否则从可执行文件中加载pandas将会失败(不确定是否有pyinstaller命令来创建spec文件,但是如果有,那么宁可这样做 - 见修正案#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

1
投票

与Anaconda合作时的简单解决方案:

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

- 打开终端并使用pipinstall包含所需的软件包。 (确保它在新环境中)

-Run pyinstaller。

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


0
投票

文件增长如此之大的原因是我正在研究公司的共享驱动器(公司政策)。将工作目录移动到本地驱动器后问题消失了。我也开始使用virtualenv并且排除了脚本中没有使用的一些依赖项,它们都允许变得非常小,易于共享.exe文件。

© www.soinside.com 2019 - 2024. All rights reserved.