由于缺少._ufuncs dll,Python scipy模块导入错误

时间:2016-08-18 14:07:15

标签: python dll import scipy

我在python中使用scipy进行子模块集成时遇到了一些麻烦。 我有64位架构,根据python解释器的第一行(见下文),我似乎也在使用64位版本的Python和Anaconda。

下面是问题(我刚写了最小的代码来显示正在发生的事情)

Python 3.4.3 |Anaconda 2.3.0 (64-bit)| (default, Mar  6 2015, 12:06:10) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import scipy
>>> import scipy.integrate
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\*********\Anaconda3\lib\site-packages\scipy\integrate\__init__.py", line 55, in <module>
    from .quadrature import *
  File "C:\Users\*********\Anaconda3\lib\site-packages\scipy\integrate\quadrature.py", line 10, in <module>
    from scipy.special.orthogonal import p_roots
  File "C:\Users\*********\Anaconda3\lib\site-packages\scipy\special\__init__.py", line 636, in <module>
    from ._ufuncs import *
ImportError: DLL load failed: Le module spécifié est introuvable.

导入scipy.special

也是如此

正如您所见,scipy可以导入,但scipy.integrate会生成错误。奇怪的是在文件夹中 ... \ lib \ site-packages \ scipy \ special,出现._ufuncs.pyd。 此外,我经常使用scipty用于其他目的,并且每件事通常都很好。

我使用的是0.18.0版本的scipy和pip 1.8.1。 我尝试用conda重新安装scipy,但这似乎没有改变任何东西。

似乎无法找到dll。我在互联网上发现了一些帖子(包括建议在C:\ Windows \ SysWOW64中下载“libmmd.dll”的帖子),类似的问题,但似乎都没有。我的猜测是,这仍然是32-64位兼容性的pb,因为这是python中最常见的pb,我记得几个月前第一次收集所有东西时都有巨大的pb。

因此,跟进最初的问题,有没有办法知道每个软件包或dll的哪个版本(32位或64位)是否有效安装/加载? 您是否有其他想法我收到此错误消息?

感谢您的回答,这个问题非常令人沮丧...

3 个答案:

答案 0 :(得分:6)

如果您使用conda并不想如上所述安装MKL并复制DLL,我发现您可以通过重新安装icc_rt软件包来解决此问题:

conda remove icc_rt --force
conda install icc_rt --no-deps

icc_rt程序包具有必需的DLL(LIBIFCOREMD.DLLLIBMMD.DLL)。

以下是我调查此问题的方式:

使用以下命令将Anaconda升级到最新版本后,我遇到了问题:

conda update conda
conda update anaconda

我在执行import scipy.special的同时运行Process Monitor来跟踪它试图加载的DLL,并发现它是libifcoremd.dllProcMon Trace

然后我搜索了conda pkg缓存文件夹(~/AppData/Local/Continuum/Anaconda3),以找出哪个程序包带有此DLL

$ find . -name '*ifcoremd.*'
./pkgs/icc_rt-2017.0.4-h97af966_0/Library/bin/libifcoremd.dll
./pkgs/mkl-11.3.3-1/Library/bin/libifcoremd.dll
./pkgs/mkl-2017.0.1-0/Library/bin/libifcoremd.dll
./pkgs/mkl-2017.0.3-0/Library/bin/libifcoremd.dll

因此,它同时位于mklicc_rt软件包中。但是看起来最新的anaconda(5.2.0)发行了mkl的较新版本,而该版本显然不再具有这些DLL:

$ conda list|egrep '^(mkl|icc_rt)\s'
icc_rt                    2017.0.4             h97af966_0
mkl                       2018.0.2                      1

因此大概是当conda升级我的mkl时,它从我的Library\bin文件夹中删除了DLL。因此,通过强制重新安装icc_rt,我得到了DLL。

答案 1 :(得分:2)

我通过以下步骤解决了:

  1. 安装MKL

  2. 根据我的情况,我使用Dependency Wakler检查了\scipy\special\_ufuncs.cp36-win_amd64.pyd。发现我想念LIBIFCOREMD.DLLLIBMMD.DLL。我通过安装Intel Distribution for Python解决了这个问题。 Intel Distribution for Python实际上是Python 3.5的特殊版本。它包含了大量的DLL。安装Intel Distribution for Python后,转到path_to_Intel_Distribution_for_Python\Library\bin(在我的计算机上为C:\IntelPython3\Library\bin),并将所有文件夹和文件复制到path_to_your_default_python\Library\bin(在我的计算机上为C:\Anaconda3\Library\bin)。 capture (根据this answer忽略其他缺少的dll)。

  3. 然后问题解决了。

    PS。也许有时需要path_to_Intel_Distribution_for_Python\Library\include\中的文件?

    PPS。如果您不再需要,可以卸载Intel Distribution for Python。

    PPPS。更简单的方法是使用方向盘。 Unofficial Windows Binaries for Python Extension Packages。但我喜欢使用conda update --all来更新包......然后一切都搞砸了......

答案 2 :(得分:0)

似乎DLL加载失败,因为指定的模块无法恢复?

请参阅:

ImportError: DLL load failed: %1 is not a valid Win32 application. But the DLL's are there