Numpy Pyinstaller ImportError: 无法导入multiarray名称

6

我遇到了一个类似于这里报告的问题,似乎是一个未解决的问题。

在编译exe后,pyinstaller构建会抛出以下错误,很可能是由numpy\core\ init.py引起的:

有一些建议认为这与冲突的numpy安装有关,但是我已经多次卸载和重新安装,并搜索任何其他安装都没有成功。目前正在使用numpy-1.9+MKL二进制文件运行。

我还将multiarray.pyd文件标记为spec文件中的二进制文件以获取。没有成功。

我不知道是什么原因导致这个问题,因为我对init文件结构并不特别熟悉。有什么办法可以导入它吗?

错误的回溯:

Traceback (most recent call last):
  File "<string>", line 50, in <module>
  File "C:\Python27\Lib\site-packages\PyInstaller\loader\pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "C:\Users\Hp\PycharmProjects\GISdev\build\gis_helper2\out00-PYZ.pyz\mpl_toolkits.basemap", line 15, in <module>
  File "C:\Python27\Lib\site-packages\PyInstaller\loader\pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "C:\Users\Hp\PycharmProjects\GISdev\build\gis_helper2\out00-PYZ.pyz\matplotlib", line 133, in <module>
  File "C:\Python27\Lib\site-packages\PyInstaller\loader\pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "C:\Users\Hp\PycharmProjects\GISdev\build\gis_helper2\out00-PYZ.pyz\matplotlib.rcsetup", line 19, in <module>
  File "C:\Python27\Lib\site-packages\PyInstaller\loader\pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "C:\Users\Hp\PycharmProjects\GISdev\build\gis_helper2\out00-PYZ.pyz\matplotlib.colors", line 52, in <module>
  File "C:\Python27\Lib\site-packages\PyInstaller\loader\pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "C:\Users\Hp\PycharmProjects\GISdev\build\gis_helper2\out00-PYZ.pyz\numpy", line 200, in <module>
  File "C:\Python27\Lib\site-packages\PyInstaller\loader\pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "C:\Users\Hp\PycharmProjects\GISdev\build\gis_helper2\out00-PYZ.pyz\numpy.add_newdocs", line 13, in <module>
  File "C:\Python27\Lib\site-packages\PyInstaller\loader\pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "C:\Users\Hp\PycharmProjects\GISdev\build\gis_helper2\out00-PYZ.pyz\numpy.lib", line 8, in <module>
  File "C:\Python27\Lib\site-packages\PyInstaller\loader\pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "C:\Users\Hp\PycharmProjects\GISdev\build\gis_helper2\out00-PYZ.pyz\numpy.lib.type_check", line 11, in <module>
  File "C:\Python27\Lib\site-packages\PyInstaller\loader\pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "C:\Users\Hp\PycharmProjects\GISdev\build\gis_helper2\out00-PYZ.pyz\numpy.core", line 14, in <module>
ImportError: cannot import name multiarray

源自 init 文件的问题可能导致此问题:

from __future__ import division, absolute_import, print_function

from .info import __doc__
from numpy.version import version as __version__

# disables OpenBLAS affinity setting of the main thread that limits
# python threads or processes to one core
import os
envbak = os.environ.copy()
if 'OPENBLAS_MAIN_FREE' not in os.environ:
    os.environ['OPENBLAS_MAIN_FREE'] = '1'
if 'GOTOBLAS_MAIN_FREE' not in os.environ:
    os.environ['GOTOBLAS_MAIN_FREE'] = '1'
from . import multiarray
os.environ.clear()
os.environ.update(envbak)
del envbak
del os

from . import umath
from . import _internal  # for freeze programs
from . import numerictypes as nt
multiarray.set_typeDict(nt.sctypeDict)

@Richard Snape - 该代码在Python 2.7中从控制台和Pycharm都能正常运行。只有在运行exe时才会出现错误,因此我认为这是一个numpy-pyinstaller兼容性问题。我在想是否从.pyd文件反编译为.py文件可能是一个解决方案。错误的来源是init.py中的第14行调用:"from . import multiarray"当未编译时,Numpy显然可以动态地处理加载.pyd,但在被冻结在exe中时可能需要一个.py文件。 - Praxis
1
一些可以加入问题以使诊断更快的内容:发布您项目的.spec文件的内容(即在运行pyinstaller的目录中,您将拥有一个名为GISdev.spec或类似的文件)。尝试使用--onedir模式运行 - 有关详细信息,请参见此处。我记得曾经通过这种方式找到过一个未打包的库的部分... - J Richard Snape
1
好的 - 我有一些时间。我刚在Windows上进行了pyinstaller的干净安装(从您的路径名中推断),并且使用了一个最小的文件,其中包括import numpy as np,然后是print numpy.__version__。这一切都很顺利。我使用的是Python 2.7(再次从您的路径推断)和numpy 1.9。您能否提供一个包含失败部分的最小化版本的Python代码 - 可以查看http://stackoverflow.com/help/mcve以获取有关如何创建失败的最小情况的帮助。 - J Richard Snape
1
抱歉,今晚我没有太多时间。还有一个问题 - 你是从“dist”目录而不是“build”目录运行exe文件,对吗?如果不是 - 那可能是你的问题(尽管我希望它会在更早的时候失败并显示“找不到Win32”或类似的错误)。如果这不是问题 - 你可以尝试使用pip uninstall卸载并重新安装,这是至少消除问题的有用方法。 - J Richard Snape
1
很高兴能帮忙 - 你想写一个答案还是让我来?我注意到你说“(mostly)”。我希望你已经解决了最后的问题。如果问题是你现在无法包含一些二进制文件,那么请发布你的.spec文件,我们可以解决它。a.binariesAnalysis对象的成员,而不是文件。你可能想看看http://pythonhosted.org/PyInstaller/#adding-files-to-the-bundle。像我上面说的那样,随着pyinstaller问题的提出,发布`.spec`是一个好主意。 - J Richard Snape
显示剩余6条评论
2个回答

3
在评论交流后,问题被定位到了由OP使用的自定义.spec文件中的问题。在.spec文件中,可能会有类似以下的一行代码:
coll = COLLECT(exe,
           a.binaries,
           a.zipfiles,
           a.datas,
           strip=None,
           upx=True,
           name='nptest')

已被替换为

coll = COLLECT(exe,
           a.binaries1,
           a.zipfiles,
           a.datas,
           strip=None,
           upx=True,
           name='nptest')

尝试引入文件a.binaries1,以便使pyinstaller使用一些自定义的.dll二进制文件。

实际上,a.binariesAnalysis对象的成员,并且需要保留。在收集行中添加额外二进制文件的方法如下(按照文档所述)。请注意,您可以通过更改元组的第一个成员来更改分发中文件的名称(如果需要)。

coll = COLLECT(exe,
           a.binaries+[('zipcontainer.dll','C:\\Windows\\System32\\zipcontainer.dll','BINARY')],
           a.zipfiles,
           a.datas,
           strip=None,
           upx=True,
           name='nptest')

.spec文件位于何处? - java_mouse
嗨 @java_mouse - 看看文档的这一部分:http://pythonhosted.org/PyInstaller/#using-spec-files。默认情况下,它在当前目录中,除非你已经设置了那里讨论的选项。该部分还提供了大量关于如何自定义它的信息。 - J Richard Snape
.spec文件的路径是什么? - NirAv JaIn
嗨@NirAvJaIn。根据上面的评论,它通常在当前目录中。链接的文档解释了其他选项。 - J Richard Snape

1
我正在使用 Pycharm IDE 和 Anaconda 在 64 位 Windows 10 上。
我按照以下顺序解决了问题:
1. 卸载 Anaconda 中的 numpy; 2. 删除文件夹 C:\Users\(计算机名)\AppData\Roaming\Python\Python35\site-packages 中相关的 numpy 文件; 3. 在 Anaconda 中重新安装 numpy。
在你的情况下,我建议你在删除文件夹 C:\Python27\Lib\site-packages\PyInstaller\loader\ 中的文件后重新安装 numpy。

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