我在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位)是否有效安装/加载? 您是否有其他想法我收到此错误消息?
感谢您的回答,这个问题非常令人沮丧...
答案 0 :(得分:6)
如果您使用conda并不想如上所述安装MKL并复制DLL,我发现您可以通过重新安装icc_rt软件包来解决此问题:
conda remove icc_rt --force
conda install icc_rt --no-deps
icc_rt
程序包具有必需的DLL(LIBIFCOREMD.DLL
和LIBMMD.DLL
)。
以下是我调查此问题的方式:
使用以下命令将Anaconda升级到最新版本后,我遇到了问题:
conda update conda
conda update anaconda
我在执行import scipy.special
的同时运行Process Monitor来跟踪它试图加载的DLL,并发现它是libifcoremd.dll
。
然后我搜索了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
因此,它同时位于mkl
和icc_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)
我通过以下步骤解决了:
安装MKL。
根据我的情况,我使用Dependency Wakler检查了\scipy\special\_ufuncs.cp36-win_amd64.pyd
。发现我想念LIBIFCOREMD.DLL
和LIBMMD.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
)。
(根据this answer忽略其他缺少的dll)。
然后问题解决了。
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