我尝试使用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。这可能是事吗?
任何帮助将不胜感激。
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
此外,使用路径中的国家字母可能会出现一些错误,因此开发工具的英文用户帐户很好。
这可能是因为使用numpy
构建的anaconda版mkl。
如果你想减少可分发的大小,你可以使用单独的建筑virtual environment与通过pip
而不是conda
安装的软件包
这是一种仍然使用conda
并避免使用mkl
的方法。使用此备用命令安装pandas之前安装numpy:
conda install -c conda-forge numpy
避免使用mkl
,在其位置使用OpenBLAS包。 this issue at conda/conda-forge/numpy-feedstock github repo的完整解释。
你需要纯粹的python环境,没有Anaconda。
因为它有太多无用的包。使用尽可能少的软件包在另一台PC上安装新的python环境!
然后再次尝试使用pyinstaller。使用此方法,pyinstaller将文件从200M减少到8M。
PS:如果你缺少一些包,你可以pip安装......
我在Windows 10上使用了Anaconda 3.5.5 for Python,并且使用Anaconda发行版也获得了过大的可执行文件。
我能够通过执行以下操作来纠正此问题:
python -m venv C:/Python/NewEnv
这将在C:/ Python / NewEnv中创建一个带有基本python,pip和setuptools的虚拟环境
C:/Python/NewEnv/Scripts/activate
你会知道环境是不同的,因为你的命令提示符将以你的新环境名称开头(NewEnv)
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
我不得不使用这些版本,因为我尝试了不同的版本,但任何后续版本的熊猫都给了我更多的问题。
C:/Python/NewEnv/Scripts/pyinstaller --onefile program.py
新创建的.spec文件中将有一个隐藏的导入行:
hiddenimports=[],
更改此项以添加pandas._libs.tslibs.timedeltas
hiddenimports=['pandas._libs.tslibs.timedeltas'],
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
与Anaconda合作时的简单解决方案:
- 在Anaconda Navigator中创造一个新环境。 (新环境没有导致问题的大量软件包。)
- 打开终端并使用pipinstall包含所需的软件包。 (确保它在新环境中)
-Run pyinstaller。
我将.exe从300 MB减少到30 MB。
文件增长如此之大的原因是我正在研究公司的共享驱动器(公司政策)。将工作目录移动到本地驱动器后问题消失了。我也开始使用virtualenv并且排除了脚本中没有使用的一些依赖项,它们都允许变得非常小,易于共享.exe文件。