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找不到函数

物联沃分享整理
物联沃-IOTWORD物联网 » Python读取dll库报错:[WinError 126]找不到指定的模块

发表评论