运行程序的时候,发现了ImportError DLL load failed 找不到指定的程序
的报错。网上搜了一天多都找不到解决办法。这里我的解决过程整理出来,希望可以帮助到和我遇到一样问题的人。
(不想看可以跳过)
首先澄清一点,这个报错不是ModuleNotFoundError: No module named 'XXX'
。
ModuleNotFoundError
的报错是指:在.py
文件的搜索路径下,找不到指定的Module
。(这种问题分两种情况,一种是你压根就没安装这个包,一种是你安装的路径不对。)
ImportError DLL load failed
的报错,简单来说就是你写的时候不报错(比如ModuleNotFoundError: No module named 'XXX'
下,在pycharm中写import XXX
会标红),运行的时候才报错。
这说明你这个包,是在默认的搜索路径下的。由于你这个包有问题,才导致写的时候不报错,运行的时候才报错。
另外需要说一下DLL
这个东西。转自DLL文件的百度百科:
库文件即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
,要求某些库的版本>=某个版本。
没想到还会有向上不兼容的问题,即依赖包版本过高,会导致依赖这个包的第三方库无法正常使用(我遇到的就是这个问题)。
有两种方式
通过命令行查看: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,所以有第二种方法。
去官网查看,百度即可。
比如百度sklearn
,可以看到依赖包的版本要求。
[外链图片转存失败(img-4wCxZvnB-1566137629595)(C:\Users\73416\AppData\Local\Temp\1566133960375.png)]
(写给我自己看,作为一个记录)
在2019.8.16,运行程序的时候没有问题。
在2019.8.17运行的时候,突然发现会报错ImportError DLL load failed 找不到指定的程序。
。报错的语句是import sklearn
和import seaborn
。当时以为是个小问题(盲目自信),胡乱一顿操作没有什么进展。
2019.8.18静下心来好好debug。。。
首先,在17号我发现,在pycharm中运行会报错,但是在命令行运行(当然需要增加搜索路径‘E:\\Anaconda\\lib\\site-packages\\’
)是可以的。
之后我打印二者的搜索路径sys.path
:
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!')