Windows错误:[错误 126] 找不到指定模块

51 投票
15 回答
157404 浏览
提问于 2025-04-15 17:15

我在用下面的代码在Python中加载一个dll文件:

if os.path.exists(dll_path):
     my_dll = ctypes.cdll.LoadLibrary(dll_path)

但是我一直收到以下错误信息:

WindowsError: [错误 126] 找不到指定的模块

虽然dll文件在我指定的路径上,但我不明白为什么会出现这个错误。

15 个回答

7

如果有其他人碰到这个非常具体的问题,可能会有帮助。
在使用PyTorch的时候,会出现一个问题,就是它会影响到DLL的加载。一旦你运行了 import torch 这行代码,之后再加载其他的DLL就会失败。所以如果你在用PyTorch并且需要加载自己的DLL,你就得先把所有的DLL都导入好,才能正常使用。这个问题在使用PyTorch 1.5.0和Python 3.7时确认过。

39

注意,即使你的DLL文件在路径中,如果这个DLL依赖于其他不在你路径中的DLL,你也可能会遇到同样的错误。在这种情况下,Windows找不到一个依赖项。Windows并不太擅长告诉你它找不到什么,只是简单地说没有找到东西。要弄清楚具体缺少了什么,就得靠你自己去查找。你可以在这里找到Windows的DLL搜索路径:http://msdn.microsoft.com/en-us/library/7d83bc18.aspx

在我的情况下,确保所有需要的DLL都在同一个目录下,并使用os.chdir()切换到那个目录,解决了这个问题。

20

当我看到这种情况时,通常是因为路径中有反斜杠,这些反斜杠会被转换。

举个例子,下面这个会失败,因为字符串中的 \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中用它处理路径已经很多年了,没遇到过问题 :)

撰写回答