caffe报错(9)ImportError: DLL load failed: 找不到指定的程序。

爆出错误:ImportError: DLL load failed: 找不到指定的程序。

问题解析

  • 首先,这个报错并不同于运行中出现ModuleNotFoundError: No module named ‘XXX’。

ModuleNotFoundError的报错是指:在.py文件的搜索路径下,找不到指定的Module。

(这种问题分两种情况,一种是你压根就没安装这个包一种是你安装的路径不对。)

而ImportError DLL load failed的报错,简单来说就是你写的时候不报错(比如ModuleNotFoundError: No module named 'XXX’下,在pycharm中写import XXX会标红),运行的时候才报错。

这说明你这个包,是在默认的搜索路径下的。由于你这个包有问题,才导致写的时候不报错,运行的时候才报错。

  • 另外需要说一下DDL这个东西。转自DDL文件的百度百科:

库文件即DLL(Dynamic Link Library)文件,是动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。

ImportError DLL load failed的报错,说白了是函数库调用其依赖库时出现了问题


实例问题

  • 面对的问题:
import sklearn
import seaborn

sklearn和seaborn这两个库都有依赖库。比如sklearn的依赖库有numpy, scipy和joblib。

这里要吐槽一个事情,python的向下不兼容的问题是挺明显的,最显著的就是python3完全不兼容python2,另一个表现是,第三方库都有dependencies,要求某些库的版本>=某个版本。

没想到还会有向上不兼容的问题,即依赖包版本过高,会导致依赖这个包的第三方库无法正常使用(我遇到的就是这个问题)。

  • 查看依赖库信息有两种方式
  1. 通过命令行查看:conda search package_name --info

比如查看seaborn的信息,在命令行输入conda search seaborn --info,可以查看seaborn各版本的信息(包括依赖包的信息):
在这里插入图片描述

Loading channels: done
seaborn 0.8.0 py27h5729117_0
……

seaborn 0.8.0 py35hda3c85b_0
……

seaborn 0.9.0 py37_0
--------------------
file name   : seaborn-0.9.0-py37_0.tar.bz2
name        : seaborn
version     : 0.9.0
build       : py37_0
build number: 0
size        : 379 KB
license     : BSD 3-Clause
subdir      : win-64
url         : https://repo.anaconda.com/pkgs/main/win-64/seaborn-0.9.0-py37_0.tar.bz2
md5         : 54e8660d9286b4724af1262886b6a08c
timestamp   : 2018-09-21 11:32:49 UTC
dependencies:
  - matplotlib >=1.4.3
  - numpy >=1.9.3
  - pandas >=0.14.0
  - python >=3.7,<3.8.0a0
  - scipy >=0.15.2
  - statsmodels >=0.5.0

可以看到最新版本的seaborn要求matplotlib >=1.4.3、numpy >=1.9.3、pandas >=0.14.0、python >=3.7,

,3.8.0a0、scipy >=0.15.2和statsmodels >=0.5.0。

但是无法查看sklearn的信息,因为Anaconda受制于channel,所以有第二种方法。

  1. 去官网查看,百度即可。

比如百度sklearn,可以看到依赖包的版本要求。

pycharm:

['C:\Users\73416\PycharmProjects\HSIproject', 'C:\Users\73416\PycharmProjects\HSIproject', 'E:\Anaconda\python37.zip', 'E:\Anaconda\DLLs', 'E:\Anaconda\lib', 'E:\Anaconda', 'E:\Anaconda\lib\site-packages', 'E:\Anaconda\lib\site-packages\win32', 'E:\Anaconda\lib\site-packages\win32\lib', 'E:\Anaconda\lib\site-packages\Pythonwin', 'E:\PyCharm 2018.3.4\helpers\pycharm_matplotlib_backend']

命令行:

['C:\\Users\\73416\\PycharmProjects\\HSIproject', 'E:\\Python37\\python37.zip', 'E:\\Python37\\DLLs', 'E:\\Python37\\lib', 'E:\\Python37', 'E:\\Python37\\lib\\site-packages', 'E:\\Python37\\lib\\site-packages\\win32', 'E:\\Python37\\lib\\site-packages\\win32\\lib', 'E:\\Python37\\lib\\site-packages\\Pythonwin', 'E:\\Anaconda\\lib\\site-packages\\']

可见pycharm会使用Anaconda路径下的函数库(‘E:\Anaconda\lib’),命令行运行的时候会使用Python37路径下的函数库(‘E:\Python37\lib’)。

也就是说,如果我用Python37路径下的相关函数库,去替代Anaconda路径下的相关函数库,那么在pycharm中就可以正常运行了。

这之后我用Python37路径下sklearn的文件夹,替换了Anaconda路径下sklearn的文件夹,发现还是一样的报错信息。

然后我就怀疑是不是依赖包的的版本问题,导致了ImportError 的出现。(终于终于怀疑到点子上了!!!)

之后我通过_version_()函数打印了两个路径下,sklearn的依赖包的版本:

Python37:

sklearn: 0.21.3
numpy: 1.15.3
scipy: 1.3.0
joblib: 0.13.2
Anaconda:

import sklearn
sklearn.__version__
Out[4]: '0.21.3'
numpy: 1.16.2
scipy: 1.2.1
joblib: 0.13.2

然后,我就把Anaconda下的numpy库从1.16.2降级到1.15.3。

即在命令行里输入conda install numpy=1.15.3 (pip的命令是pip install numpy==1.15.3,但是路径不是 Anaconda的路径了,还得改路径)。

然后发现成功了!!!sklearn和seaborn都解决了!!!居然是numpy这个第三方库向上不兼容的问题(活久见系列)。

最后Anaconda路径下,依赖包的版本:

sklearn: 0.21.3
numpy: 1.15.3
scipy: 1.1.0
joblib: 0.13.2

源代码

import sys,os
#curPath = os.path.abspath(os.path.dirname(__file__))
#print(sys.path)
##print(os.path.dirname(__file__))
##print(curPath)
##rootPath = os.path.split(curPath)[0]
##print(os.path.split(curPath))
##print(rootPath)
##sys.path.append(rootPath)
sys.path.append('E:\\Anaconda\\lib\\site-packages\\')
##sys.path = ['C:\\Users\\73416\\PycharmProjects\\HSIproject', 'E:\\Python37\\python37.zip', 'E:\\Python37\\DLLs', 'E:\\Python37\\lib', 'E:\\Python37', 'E:\\Python37\\lib\\site-packages', 'E:\\Python37\\lib\\site-packages\\win32', 'E:\\Python37\\lib\\site-packages\\win32\\lib', 'E:\\Python37\\lib\\site-packages\\Pythonwin', 'E:\\Anaconda\\lib\\site-packages\\']

print(sys.path)
#from utils import open_file
import sklearn
import numpy
import scipy
import joblib
import seaborn

print('sklearn:',sklearn.__version__)
print('numpy:',numpy.__version__)
print('scipy:',scipy.__version__)
print('joblib:',joblib.__version__)

print('done!')

实例问题

本文针对由于版本、依赖库等造成的若干import matplotlib.pyplot as plt语句报错问题。

操作系统:win10
Python版本:3.7.0
matplotlib.pyplot 是常见的可视化工具之一,风格与MATLAB类似,可以方便的绘制图像、展示结果。这一工具的使用需要在代码中执行:
import matplotlib.pyplot as plt

实际由于版本、依赖库等原因可能会报错,本文小结了自己使用过程中遇到的的几个问题及解决方案。操作系统为win10,Python版本为3.7.0。
开始时matplotlib版本为2.2.3
import matplotlib.pyplot as plt后报错为
ImportError: DLL load failed: 找不到指定的模块。
在这里插入图片描述
这种情况一般是由于matplotlib版本较低,可以通过安装新版本matplotlib解决(3.0.x)
命令行执行:pip install -U matplotlib
将matplotlib升级到了2.2.4,如下图所示
在这里插入图片描述

  • 然而后面也可能会遇到fontlist-v300.json找不到的问题,

FileNotFoundError: [Errno 2] No such file or directory: ‘C:\Users.matplotlib\fontlist-v300.json’

只好重新安装。执行

pip uninstall matplotlib
pip --no-cache-dir install -U matplotlib

没有出现上述问题

  • 再次尝试import matplotlib.pyplot, 报错如下:

ImportError: cannot import name 'get_running_interactive_framework’ from ‘matplotlib.backends’
(C:\Python\Python3\lib\site-packages\matplotlib\backends_init.py)

这一问题暂时没找的答案,但是在命令行退出python后再重新进入,这一问题就没有了,取而代之的是:

ModuleNotFoundError: No module named ‘six.moves’; ‘six’ is not a package

这一问题通过重装six包解决:

pip uninstall six
pip install --user six

至此终于可以用了!

总结

  • 问题原因有两种情况:
  1. 函数库本身有问题,导致调用异常。
  2. 依赖包版本不符,导致调用异常。
  • 主要就是两种解决办法

    1. 重新安装该函数库。
    2. 检查依赖包的版本(过高或过低)
发布了61 篇原创文章 · 获赞 15 · 访问量 946

猜你喜欢

转载自blog.csdn.net/weixin_42535423/article/details/103908250