Python调用dll库函数:[WinError 126]找不到指定的模块

这个问题踩了很多坑,最后解决了,在这里记录一下。

最近需要用Python调用C编译好的dll库函数,按照流程来讲,将dll文件放在工程目录中,然后

from ctypes import *
mydll = cdll.LoadLibrary('./xxx.dll')  % xxx.dll为dll文件名

 这样就可以实现dll函数的装载。然而,运行结果持续报这个错

OSError: [WinError 126] 找不到指定的模块。

起初以为是路径没有写清楚,于是在 cdll.LoadLibrary() 函数中填入了dll文件的绝对路径,没想到还是报错,于是开始浏览网页去找解决方法,提到最多的是需要load的dll库有其它的依赖库,当这些依赖库缺少时就会报错。假如没有该dll的源程序,并不能得知依赖库有哪些时,就需要使用Dependency Walker查找其依赖库。下载链接:http://www.dependencywalker.com/

注意要选对版本。下载好后,启动depends.exe,将要载入的dll拖进去就行。这个时候就会像下图一样,Dependency Walker显示未响应。

Python调用dll库函数:[WinError 126]找不到指定的模块_第1张图片

这个时候不能着急退出,因为查找依赖库的过程要花费很长时间,一定要耐心等待(至少5分钟)。以msvcrt.dll为例,该库的依赖库如下

Python调用dll库函数:[WinError 126]找不到指定的模块_第2张图片

可以发现缺失了很多依赖库,全都找来基本是不可能的事情,这个时候只需要把展开的依赖关系全都折叠起来,把缺失的一级依赖库找到就可以了。

Python调用dll库函数:[WinError 126]找不到指定的模块_第3张图片

中间那些黄色的问号就是缺失的依赖库,可以去C:\Windows\System32尝试找一下,如果没有的话就需要去下载,推荐去https://cn.dll-files.com下载它们。

之后,在工程目录下新建文件夹,把原本的dll文件和找来的依赖库全都扔到里面,然后在LoadLibrary之前使用下面这一行把这个文件夹添加到工作目录。

os.chdir(r'存放dll文件夹的路径')

再运行一次,如果没有报错,则大功告成。然而还是报错,于是又翻了国内外各大论坛,但还是没能解决。打算放弃治疗开始胡折腾的时候发现是Python解释器(Interpreter)的问题。之前要跑深度学习模型的时候用Anaconda创建了一个pytorch的虚拟环境,使用这个虚拟环境做解释器的时候就会报错,换到Anaconda的base环境后,重启了开发环境(我用的pycharm)就好了。

Python调用dll库函数:[WinError 126]找不到指定的模块_第4张图片 一直使用的是Anaconda创建的pytorch虚拟环境 Python调用dll库函数:[WinError 126]找不到指定的模块_第5张图片 把这个虚拟环境替换成Anaconda的base环境,之后重启pycharm就可以了

然而,解决问题的原理不明,在更换Interpreter并重启后还是有可能继续报错。这时候还可以再做一些努力:

1. 把环境里的所有Python包全部更新一遍,使用

pip-review --interactive

把环境里的所有Python包全部更新到最新,之后重启开发环境再试一遍。

2. 如果Python版本在3.8及以上,可以考虑换到低版本(如3.6)的Python环境再试试。

如果上面的过程还没有解决的话,看看自己的dll文件路径是不是写错了。

总之,要用Python调用dll时先检查自己的解释器是不是虚拟环境,如果是虚拟环境则需要换到其它环境,且更换后需要重启开发环境。载入dll时尽量使用绝对路径。希望能帮到遇到同样问题的人,欢迎交流。

你可能感兴趣的:(python,pycharm,c语言)