Windows错误:[错误 126] 找不到指定模块
我在用下面的代码在Python中加载一个dll文件:
if os.path.exists(dll_path):
my_dll = ctypes.cdll.LoadLibrary(dll_path)
但是我一直收到以下错误信息:
WindowsError: [错误 126] 找不到指定的模块
虽然dll文件在我指定的路径上,但我不明白为什么会出现这个错误。
15 个回答
如果有其他人碰到这个非常具体的问题,可能会有帮助。
在使用PyTorch的时候,会出现一个问题,就是它会影响到DLL的加载。一旦你运行了 import torch
这行代码,之后再加载其他的DLL就会失败。所以如果你在用PyTorch并且需要加载自己的DLL,你就得先把所有的DLL都导入好,才能正常使用。这个问题在使用PyTorch 1.5.0和Python 3.7时确认过。
注意,即使你的DLL文件在路径中,如果这个DLL依赖于其他不在你路径中的DLL,你也可能会遇到同样的错误。在这种情况下,Windows找不到一个依赖项。Windows并不太擅长告诉你它找不到什么,只是简单地说没有找到东西。要弄清楚具体缺少了什么,就得靠你自己去查找。你可以在这里找到Windows的DLL搜索路径:http://msdn.microsoft.com/en-us/library/7d83bc18.aspx
在我的情况下,确保所有需要的DLL都在同一个目录下,并使用os.chdir()切换到那个目录,解决了这个问题。
当我看到这种情况时,通常是因为路径中有反斜杠,这些反斜杠会被转换。
举个例子,下面这个会失败,因为字符串中的 \t 会被转换成制表符(TAB字符)。
>>> import ctypes
>>> ctypes.windll.LoadLibrary("c:\tools\depends\depends.dll")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\tools\python271\lib\ctypes\__init__.py", line 431, in LoadLibrary
return self._dlltype(name)
File "c:\tools\python271\lib\ctypes\__init__.py", line 353, in __init__
self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126] The specified module could not be found
如果这是问题所在,有三种解决方案。
a) 使用双反斜杠...
>>> import ctypes
>>> ctypes.windll.LoadLibrary("c:\\tools\\depends\\depends.dll")
b) 使用正斜杠
>>> import ctypes
>>> ctypes.windll.LoadLibrary("c:/tools/depends/depends.dll")
c) 使用原始字符串(在字符串前加上 r)
>>> import ctypes
>>> ctypes.windll.LoadLibrary(r"c:\tools\depends\depends.dll")
虽然第三种方法有效,但我有时觉得它不被认为是“正确”的做法,因为原始字符串本来是为了正则表达式设计的。不过,我在Windows的Python中用它处理路径已经很多年了,没遇到过问题 :)