虚拟环境中使用ctypes导入dll出现WinError 126错误如何解决
问题原因
WinError 126报错的触发原因不是你指定的目标dll不存在(你已经通过os.path.isfile确认了文件存在),而是该dll依赖的其他附属dll无法被系统找到:全局shell环境的系统路径里包含了这些依赖dll的搜索位置,而虚拟环境做了路径隔离,默认不会继承所有系统路径的搜索配置,导致加载失败。
可行解决方案
方案1(优先尝试,适配Python3.8及以上版本)
在调用ct.CDLL加载目标dll之前,先将目标dll所在的目录添加到当前进程的dll搜索路径中,修改后的代码如下:import ctypes as ct import os path = '\\some_path\\file.dll' print(os.path.isfile(path)) # 新增下面这行,添加dll所在目录到搜索路径 os.add_dll_directory(os.path.dirname(os.path.abspath(path))) lib = ct.CDLL(path)这个方法是最轻量化的,不需要修改系统环境变量,也不会影响其他进程。
方案2(校验位数匹配)
确认你虚拟环境安装的Python位数,和目标dll的编译位数完全一致:32位Python只能加载32位dll,64位Python只能加载64位dll,位数不匹配也会抛出126错误。
可以执行以下代码查看当前Python的位数:import platform print(platform.architecture()[0])和你全局shell环境的Python位数做对比,不一致的话重新安装对应位数的虚拟环境Python版本即可。
方案3(安装依赖运行库)
如果你的dll是用Visual Studio编译的,需要确认虚拟环境所在的系统上已经安装了对应版本的VC++ Redistributable运行库,没有的话安装对应版本即可解决依赖缺失问题。
内容的提问来源于stack exchange,提问作者mmonti
相关产品推荐
相关产品推荐

