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

时间:2013-09-05 23:02:08

标签: python scipy x86-64 importerror

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

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

import scipy
print scipy.version

返回

<module 'scipy.version' from 'C:\Python27\lib\site-packages\scipy\version.pyc'>

正如所料。

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

from scipy import sparse

我明白了:

ImportError: DLL load failed: %1 is not a valid Win32 application.

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

有谁知道这个解决方案?或者直接安装scipy的窗口使用其中一个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.

1 个答案:

答案 0 :(得分:5)

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

因此,有两个步骤来跟踪此问题。


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

您可以通过查看ImportError中的追溯来弄清楚它 - 它应该是链中最低模块import的内容。 (如果您不理解回溯,请将其粘贴到您的答案中,并希望其他人可以告诉您。)

如果做不到这一点,你将不得不手动完成任务。您可以查看站点包中的scipy/sparse/__init__.py来源或online in the repository查看其内容,然后逐个尝试每个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)

...问题在于scipy.sparse.csr,即scipy/sparse/csr.py无法加载scipy.sparse._csr,这几乎肯定是一个名为_csr.dll或{{1}的文件},以及_csr.pyd目录中的某个位置。 完全可能有点复杂,因为代码使用自定义路径名调用scipy而不是使用简单的imp.load_module语句...但找到它应该不会太难。 (如果您遇到问题,您可以随时将import暂时编辑为csr.py路径名,然后再将其传递给print。)

所以,那是你需要检查的库。


现在您load_module / .pyd文件实际上有责任,有两种可能性。

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

如果没有,如果必须链接到另一个.dll已损坏或错误的架构。

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


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

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

作为the scipy website explains,下载像Anaconda或Enthought这样的“科学Python发行版”要容易得多。

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