使用pyinstaller和numpy时,可执行文件的大小问题

6
我用numpy和Qt编写了一个短小的程序main.py:
from PyQt5 import QtWidgets
import numpy as np
import sys

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QTextEdit('hello')
    w.show()
    sys.exit(app.exec_())

当我使用pyinstaller --windowed main.py时,生成的dist文件夹大小为390MB。
如果我移除import numpy as np,则生成的dist文件夹仅为70MB。
有没有办法在仍然使用numpy的情况下减小大小?也许只包含我真正使用的dlls

1
基本上,即使是NumPy中最简单的功能也是基于一些BLAS库(以及一些更复杂的:LAPACK)构建的。这些库非常庞大,有些(MKL)甚至比其他库(OpenBLAS)还要大。 - sascha
1
没有减小可执行文件大小并保持独立的机会吗? - Jonas
我有同样的问题,你找到任何解决方法了吗?除了在代码库中完全分解Numpy... - balletpiraat
2
请参阅链接。结果发现,可执行文件的大小主要取决于numpy使用的库的类型,正如sachsa所解释的那样。一些人通过确保使用OpenBLAS而不是例如MKL来管理获得小于100MB的可执行文件。 - balletpiraat
1
相关链接:https://dev59.com/9KTja4cB1Zd3GeqPA2T9#67954011,https://stackoverflow.com/q/62262398 - djvg
显示剩余2条评论
2个回答

7

感谢用户balletpiraat提供的解决方案。

使用以下命令安装numpy: conda install -c conda-forge numpy

为了测试这个解决方案,我创建了两个anaconda环境。使用以下命令创建环境"normalnumpy":

conda create -n normalnumpy python=3.7
activate normalnumpy
conda install numpy
pip install pyinstaller

导致:
altgraph                  0.16.1                    <pip>
blas                      1.0                         mkl
certifi                   2018.10.15               py37_0
future                    0.16.0                    <pip>
icc_rt                    2017.0.4             h97af966_0
intel-openmp              2019.0                      118
macholib                  1.11                      <pip>
mkl                       2019.0                      118
mkl_fft                   1.0.6            py37hdbbee80_0
mkl_random                1.0.1            py37h77b88f5_1
numpy                     1.15.2           py37ha559c80_0
numpy-base                1.15.2           py37h8128ebf_0
pefile                    2018.8.8                  <pip>
pip                       10.0.1                   py37_0
PyInstaller               3.4                       <pip>
python                    3.7.0                hea74fb7_0
pywin32-ctypes            0.2.0                     <pip>
setuptools                40.4.3                   py37_0
vc                        14.1                 h0510ff6_4
vs2015_runtime            14.15.26706          h3a45250_0
wheel                     0.32.1                   py37_0
wincertstore              0.2                      py37_0

使用以下步骤创建了名为“extranumpy”的环境:

conda create -n extranumpy python=3.7
activate extranumpy
conda install -c conda-forge numpy
pip install pyinstaller

导致:
altgraph                  0.16.1                    <pip>
blas                      1.1                    openblas    conda-forge
certifi                   2018.10.15            py37_1000    conda-forge
future                    0.16.0                    <pip>
libflang                  5.0.0             vc14_20180208  [vc14]  conda-forge
llvm-meta                 5.0.0                         0    conda-forge
macholib                  1.11                      <pip>
numpy                     1.15.2          py37_blas_openblash8d851b4_1  [blas_openblas]  conda-forge
openblas                  0.2.20                   vc14_8  [vc14]  conda-forge
openmp                    5.0.0                    vc14_1  [vc14]  conda-forge
pefile                    2018.8.8                  <pip>
pip                       10.0.1                   py37_0
PyInstaller               3.4                       <pip>
python                    3.7.0                hea74fb7_0
pywin32-ctypes            0.2.0                     <pip>
setuptools                40.4.3                   py37_0
vc                        14                            0    conda-forge
vs2015_runtime            14.15.26706          h3a45250_0
wheel                     0.32.1                   py37_0
wincertstore              0.2                      py37_0

我用"main.py"测试了两个环境:

import numpy as np
if __name__ == '__main__':
    test = np.array([42])
    print(test)

并且。
pyinstaller --onefile main.py

"normalnumpy"可执行文件大小为228MB,而"extranumpy"可执行文件大小为10MB。


这个exe文件会像正常情况下一样存储在Dist目录中吗? - Miffy
我已经创建了(基础)环境,但有些卡住了。我该怎么办才能退出? - Miffy
@Miffy 有很多教程告诉你如何创建一个环境。如果你已经创建了,就必须激活它并像正常一样运行pyinstaller。文件将在dist文件夹中,就像从“正常”的Python安装中运行它一样。所有命令和代码都发布在我的答案中。我建议你尝试这个例子,然后继续。 - Jonas
我尝试过并进入了基本环境。我尝试了几种方法来退出它。这捣乱了我电脑中安装的所有库。现在每当我尝试安装pyinstaller时,我都会收到隔离错误。 - Miffy
1
@Miffy,你应该提出一个关于这个问题的单独问题,没有错误消息和评论很难解决。 - Jonas
3
жҲ‘дёҚеҫ—дёҚж·»еҠ зәҰжқҹжқЎд»¶blas=*=openblasд»ҘйҳІжӯўе®үиЈ…mklгҖӮеңЁиҝҷйҮҢжүҫеҲ°дәҶиҝҷдёӘе»әи®®гҖӮ - Steven C. Howell

0

如果我排除模块,可执行文件就不再是独立的了,那么我能否排除我不使用的例如numpy的部分呢? - Jonas
@Jonas,你可以排除某些模块,但不能排除numpy的部分。也许在理论上你可以...不过那会破坏numpy。根据我链接的帖子,UPX、虚拟环境和排除是减小大小的一般方法。 - user9045698

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接