Scipy - 稀疏库ImportError:DLL加载失败:%1不是有效的Win32应用程序

Pie*_*one 8 python x86-64 scipy importerror

我最近一直在将我的编程转移到64位Windows 7机器上,并且已经安装了相关的库.但是我遇到了Scipy - Sparse库的问题.

我已经为windows安装了scipy0.12.0-amd64-py27(因为我的python 2.7安装是64位版本),当直接使用scipy库时,我没有遇到任何错误.例如

import scipy
print scipy.version
Run Code Online (Sandbox Code Playgroud)

回报

<module 'scipy.version' from 'C:\Python27\lib\site-packages\scipy\version.pyc'>
Run Code Online (Sandbox Code Playgroud)

正如所料.

但是在尝试导入稀疏库时,如下所示:

from scipy import sparse
Run Code Online (Sandbox Code Playgroud)

我明白了:

ImportError: DLL load failed: %1 is not a valid Win32 application.
Run Code Online (Sandbox Code Playgroud)

可悲的是,我的知识有限,似乎无法找到相关的解决方案.最接近的是我安装了错误的库,但是如果root scipy库工作正常,我无法理解为什么会这样.

有谁知道这个解决方案?或者直接安装scipy的Windows使用其中一个python包会更好吗?

谢谢

编辑:

以下是错误的回溯:

Traceback (most recent call last):
  File "C:\Users\Piers\Documents\Physics\PhD\Code\Far Time Crank-Nicholson\FarTimeCrankNicholson.py", line 16, in <module>
    from scipy import sparse
  File "C:\Python27\lib\site-packages\scipy\sparse\__init__.py", line 182, in <module>
    from .csr import *
  File "C:\Python27\lib\site-packages\scipy\sparse\csr.py", line 15, in <module>
    from .sparsetools import csr_tocsc, csr_tobsr, csr_count_blocks, \
  File "C:\Python27\lib\site-packages\scipy\sparse\sparsetools\__init__.py", line 5, in <module>
    from .csr import *
  File "C:\Python27\lib\site-packages\scipy\sparse\sparsetools\csr.py", line 26, in <module>
    _csr = swig_import_helper()
  File "C:\Python27\lib\site-packages\scipy\sparse\sparsetools\csr.py", line 22, in swig_import_helper
    _mod = imp.load_module('_csr', fp, pathname, description)
ImportError: DLL load failed: %1 is not a valid Win32 application.
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 5

最终,这意味着它scipy.sparse本身或它导入的东西要么是依赖于加载时间,要么是依赖于破坏的.DLL或.pyd文件,要么是错误的体系结构.

因此,有两个步骤可以跟踪此情况.


首先,您需要确定哪个实际的.pyd/.DLL文件正在引发此异常.不幸的是,Python 2.7不会直接向您提供此信息.

您可以通过查看-it中的追溯来解决这个问题,这ImportError应该是import链中最低模块编写的内容.(如果您不理解回溯,请将其粘贴到您的答案中,并希望其他人可以告诉您.)

如果做不到这一点,你将不得不手动完成任务.您可以scipy/sparse/__init__.py在站点包中查看源代码,或者在存储库中在线查看它的作用,然后import逐个尝试.当您找到失败的那个时,查看其源代码,依此类推,直到到达树的底部.

既然你已经粘贴了追溯,我们可以从这部分说明:

File "C:\Python27\lib\site-packages\scipy\sparse\sparsetools\csr.py", line 22, in swig_import_helper
  _mod = imp.load_module('_csr', fp, pathname, description)
Run Code Online (Sandbox Code Playgroud)

......这个问题是scipy.sparse.csr,又名scipy/sparse/csr.py是无法加载scipy.sparse._csr,这几乎肯定是一个类似文件命名_csr.dll或者_csr.pyd,和内某处scipy的目录.究竟在哪里可能有点复杂,因为代码imp.load_module使用自定义路径名调用而不是使用简单的import语句...但找到它应该不会太难.(如果您遇到问题,你随时都可以临时修改csr.py,以print将其传递给之前的路径名load_module.)

那么,这就是你需要检查的库.


既然你.pyd/ .dll文件实际负责,有两种可能性.

首先,它本身可能被破坏,或者是错误的架构(例如,32位而不是64位)等.

如果没有,如果必须链接另一个.dll那个坏了或者错误的架构.

工具Dependency Walker可以告诉您DLL是32位还是64位,是否加载损坏太严重等等.它还可以为您提供库本身所依赖的所有DLL的列表,您可以然后检查,直到找到问题为止.


同时,如果你想知道你是如何进入这种情况的......

在Windows上安装二进制Python包通常不会安装它们所需的依赖项,或者检测它们是否缺失 - 特别是非Python依赖项.因此,在尝试使用需要这些依赖项的代码的某些部分之前,您不会看到问题.Christoph Gohkle在尝试最大限度地减少这些问题方面做得很好(通常只需安装适当的MSVC可再发行组件,Numpy-MKL版本的numpy,就是你所需要的),但是有一些限制.

由于该scipy网站解释说,这是一个更容易下载一个"科学的Python发行"像蟒蛇或Enthought.

或者,或者,如果您从源代码安装 - 例如,通过pip- 您将必须正确设置所有先决条件,否则安装将提前失败并告诉您哪里出错了.(有时它有点神秘 - 例如,如果你使用gcc工具链但没有安装gfortran,错误信息只是告诉你一些关于不要编译config.f ...但至少它是你可以搜索的东西,或在SO上发布并立即得到答案.)