ctypes 载入 dll 产生[WinError 126] 错误原因及解决

背景:c++自定义创建dll,依赖于gda201.dll(如何创建dll的部分略),并提供给python调用

Objdll = ctypes.cdll.LoadLibrary(D:\ge\testDLL\x64\Debug\testDLL.dll) # 此处建议绝对路径

报错信息:

Traceback (most recent call last): File "E:PyCharm 2017.3.4helperspydevpydev_run_in_console.py", line 53, in run_file pydev_imports.execfile(file, globals, locals) # execute the script File "E:PyCharm 2017.3.4helperspydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile exec(compile(contents+" ", file, exec), glob, loc) File "D:/ProJect/PyCharm/DataPrepare/testDLL.py", line 7, in <module> Objdll = ctypes.cdll.LoadLibrary(D:\ge\testDLL\x64\Debug\testDLL.dll) File "C:Python36libctypes\__init__.py", line 426, in LoadLibrary return self._dlltype(name) File "C:Python36libctypes\__init__.py", line 348, in __init__ self._handle = _dlopen(self._name, mode)

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

很显然,错误的原因在于testDLL.dll依赖于gda201.dll,而Python 进程没有找到

单纯将这两个dll文件放在同一目录下是没有作用的,因为Python进程起始路径并不是testDLL.dll的目录。

网上的建议是在系统环境的 path 里面里面加入 dll 的目录,或者把这些 dll 都一起复制到 Python.exe 所在的目录。但是我觉得不妥,虽然暂时解决了问题,但是若是将testDLL.dll交给其他环境使用时一样会出问题。

解决方案其实非常简单,修改当前的工作路径即可。

解决方案:

增加语句os.chdir(D:\ge\testDLL\x64\Debug\)

经验分享 程序员 微信小程序 职场和发展