8

我最近一直在将我的编程转移到 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.

可悲的是,我的知识有限,似乎找不到相关的解决方案。最接近的是我安装了错误的库,但是如果 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.
4

1 回答 1

5

最终,这意味着它scipy.sparse本身或它导入的东西在加载时要么是,要么依赖于一个损坏或架构错误的 .DLL 或 .pyd 文件。

因此,有两个步骤可以跟踪这一点。


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

您可以通过查看来自的回溯来找出它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)

...问题在于scipy.sparse.csr,又名scipy/sparse/csr.py无法加载scipy.sparse._csr,这几乎可以肯定是一个名为_csr.dllor之类的文件,并且位于目录中_csr.pyd的某个位置。确切的位置可能有点复杂,因为代码使用自定义路径名而不是使用简单的语句进行调用......但找到它应该不会太难。(如果您遇到困难,您可以随时临时编辑路径名,然后再将其传递给.)scipyimp.load_moduleimportcsr.pyprintload_module

所以,这就是您需要检查的库。


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

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

如果不是,则必须链接到另一个已损坏或用于错误架构的 .dll。

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


同时,如果您想知道自己最初是如何陷入这种境地的……</p>

在 Windows 上安装二进制 Python 包通常不会安装它们需要的依赖项,或者检测到它们丢失——尤其是非 Python 依赖项。因此,除非您尝试使用需要这些依赖项的代码的某些部分,否则您不会看到问题。Christoph Gohkle's在尽量减少这些问题方面做得很好(通常只需安装适当的 MSVC 可再发行组件,并且您只需要 Numpy-MKL 版本的 numpy),但也有限制。

正如网站解释的那样scipy下载像 Anaconda 或 Enthought 这样的“科学 Python 发行版”要容易得多。

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

于 2013-09-05T23:37:15.010 回答