Python读取dll库报错:[WinError 126]找不到指定的模块
问题描述
所做的项目需要调用C编译好的dll动态链接库,一般来说,直接运行
import ctypes
dll_read = ctypes.cdll.LoadLibrary('./xxx.dll')
就可以实现dll的读取,但却一直报错
OSError: [WinError 126] 找不到指定的模块。
如果是Python3.8以上的版本,会报错
FileNotFoundError: Could not find module ‘xxx.dll’.
(or one of its dependencies). Try using the full path with constructor syntax.
另外我在Pycharm运行时,报错
can't open file '<unprintable file name>': [Errno 2] No such file or directory
原因分析:
主要原因有两个
1. 没有找到该DLL文件,路径不对或者被杀毒软件隔离;
2. DLL动态库依赖的其他DLL动态库无法被系统找到
解决方案:
针对原因1:尝试把文件路径改为绝对路径;把杀毒软件关闭重新操作
针对原因2:补充下载该DLL依赖的DLL 动态链接库
这里主要针对原因2(缺乏依赖库)进行详述
如果无法确定相关DLL 动态库,引起这类问题的原因很可能是由于你的目标主机没有安装相关的C++环境。解决方法:下载Visual C++ Redistributable运行库,64位版本下载地址为 https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=48145
我尝试了这种方法,由于我本地已存在C++环境,显示已安装了其余版本,所以该方法对我无效
由于无法从报错中知道究竟缺少了哪个依赖库(如果不是因为dll读取而出现了这个错误,可以检查终端中报错点的库名,可能是版本问题,我之前就在使用过shapely库时遇到过这个报错,更换版本后解决),所以需要借助Dependency Walker查找其依赖库。下载链接:Dependency Walker (depends.exe) Home Page
下载对应版本后,启动depends.exe,将要载入的dll拖进去就行。界面如下
注意因为查找依赖库的过程要花费很长时间,所以界面会长时间未响应,一定要耐心等待
这里以我使用的“seg_eval.dll”为例,主要观察前面有黄色问号标注的第一级依赖库,可以去C:\Windows\System32尝试找一下,如果没有的话就需要去下载,推荐去https://cn.dll-files.com下载它们,根据缺少的dll名查询,下载到本地后放进C:\Windows\System32列表下
一般到这里问题都解决了,然而我在dll-files.com并没有找到opencv_world451d.dll,搜索发现是opencv4.5.1对应版本中的dll(与文件名中的数字符合),于是下载了对应版本的opencv,下载地址Releases – OpenCV
解压后将opencv\build\x64\vc15\bin路径下的opencv_world451d.dll放进C:\Windows\System32列表下,重新运行depends.exe载入dll发现第一级目录都不存在黄色问号
最终,重新运行库读取dll,问题解决。
Reference:
OSError: [WinError 126] 找不到指定的模块 —— 解决办法__Yucen的博客-CSDN博客
Python调用dll库函数:[WinError 126]找不到指定的模块_RealCovid19的博客-CSDN博客_python调用dll找不到函数