Numpy Pyinstaller ImportError:无法导入名称多阵列

Pra*_*xis 6 python numpy build pyinstaller

我遇到了类似于此处报道的问题,这似乎是一个尚未解决的问题.

编译exe后,pyinstaller build会抛出以下错误,这可能是由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
Run Code Online (Sandbox Code Playgroud)

从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)
Run Code Online (Sandbox Code Playgroud)

J R*_*ape 3

.spec在交换意见后,问题被隔离为OP 使用的自定义文件中的问题。在 中.spec,有一行类似:

coll = COLLECT(exe,
           a.binaries,
           a.zipfiles,
           a.datas,
           strip=None,
           upx=True,
           name='nptest')
Run Code Online (Sandbox Code Playgroud)

已被替换为

coll = COLLECT(exe,
           a.binaries1,
           a.zipfiles,
           a.datas,
           strip=None,
           upx=True,
           name='nptest')
Run Code Online (Sandbox Code Playgroud)

尝试引入一个文件a.binaries1以使 pyinstaller 能够使用一些自定义.dll二进制文件。

a.binaries是对象的成员Analysis,需要保留 - 在收集行中添加额外的二进制 gile 的方法如下(根据文档)。请注意,您可以通过更改元组的第一个成员来更改发行版中的文件名(如果需要)。

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