【问题标题】:Numpy Pyinstaller ImportError: cannot import name multiarrayNumpy Pyinstaller ImportError:无法导入名称多数组
【发布时间】:2015-12-25 13:13:58
【问题描述】:

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

编译一个exe后,pyinstaller build抛出如下错误,可能是numpy\core\ init.py引起的

有一些suggestions 与 numpy 安装冲突有关,但是我已经卸载并重新安装了几次,并且没有运气搜索任何其他安装。 当前使用 numpy-1.9+MKL 二进制文件运行。

我还将 multiarray.pyd 文件标记到规范文件中,作为要抓取的二进制文件。没有运气。

不知道是什么原因造成的,因为我对 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

从初始化文件中获取问题的可能原因:

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)

【问题讨论】:

  • 我感觉这与 numpy.core 模块中缺少 .py 文件有关。仅存在 pyd 文件,但 init 文件正在尝试导入模块 multiarray。
  • 您可以在问题中添加一些内容以加快诊断速度:为您的项目发布.spec 文件的内容(即在您运行pyinstaller 的目录中,您将拥有一个名为GISdev.spec 或类似文件的文件。尝试使用--onedir 模式运行-有关详细信息,请参阅here。我记得曾经通过该路线找到了一个未打包的库...
  • 好的 - 我有一些时间。我刚刚在 Windows 上完成了 pyinstaller 的全新安装(假设来自您的路径名)和一个由 import numpy as np 后跟 print numpy.__version__ 组成的最小文件。这一切都刚刚好™。我使用了 Python 2.7(再次从您的路径中假设)和 numpy 1.9。您能否提供一个最小版本的 your python 代码在它失败的地方 - 查看stackoverflow.com/help/mcve 以获取有关如何制作一个以您描述的方式失败的最小案例的帮助。
  • 对不起,我今晚没有太多时间。还有一个问题-您是在dist 目录而不是build 之外运行exe,对吗?如果不是 - 那可能是你的问题(尽管我希望它会因“找不到 Win32”或类似的东西而早先失败。如果这不是问题 - 你可以尝试 pip uninstall 并重新安装这是一个有用的东西至少消除。
  • 很高兴为您提供帮助 - 您想写一个答案还是我来写?我注意到你说“(大部分)”。我希望你能解决最后的弯道。如果问题是您现在无法包含一些您想要的二进制文件 - 发布您的 .spec 文件,我们可以解决。 a.binariesAnalysis 对象的成员,而不是文件。您可能想查看pythonhosted.org/PyInstaller/#adding-files-to-the-bundle。正如我上面所说的,总是发布带有 pyinstaller 问题的 .spec 是个好主意 - 否则

标签: python numpy build pyinstaller


【解决方案1】:

在 cmets 中交换后,问题被隔离为 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 对象的成员并且需要保留- 在collect 行中添加额外二进制gile 的方法是这样的(as per the docs)。请注意,您可以通过更改元组的第一个成员来更改分发中文件的名称(如果需要)。

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 - 查看文档的这一部分:pythonhosted.org/PyInstaller/#using-spec-files。默认情况下,它位于当前目录中,除非您设置了此处讨论的选项。该部分还提供了有关如何自定义它的大量信息。
  • .spec 文件的路径?
  • 嗨@NirAvJaIn。根据上面的评论。它通常在当前目录中。链接的文档解释了其他选项。
【解决方案2】:

我在 64 位 Windows 10 上使用 Pycharm IDE 和 Anaconda。

我已经通过以下顺序解决了这个问题:

  1. 在 Anaconda 中卸载 numpy
  2. 删除文件夹C:\Users\(COMPUTER NAME)\AppData\Roaming\Python\Python35\site-packages中的相关numpy文件
  3. 在 Anaconda 中重新安装 numpy

在你的情况下,我想你可以在删除文件夹 C:\Python27\Lib\site-packages\PyInstaller\loader\ 中的文件后重新安装 numpy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2016-10-23
    • 2023-03-18
    • 1970-01-01
    • 2020-11-13
    相关资源
    最近更新 更多