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

50

我正在使用以下代码在Python中加载一个dll:

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

但我不断地遇到以下错误:

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

虽然 DLL 文件位于指定路径,但我不明白为什么会出现这个错误。


你能详细说明一下你试图导入的 DLL 以及该 DLL 的作用吗?它本身可能正在尝试加载另一个找不到的 DLL。 - santosc
这个问题的答案(https://dev59.com/s0zSa4cB1Zd3GeqPkjUH)解决了我的问题 - 重复? - Junuxx
15个回答

38
请注意,即使DLL文件已经存在于您的路径中,如果该DLL依赖于其他不在您的路径中的DLL,则可能会出现相同的错误。在这种情况下,Windows找不到依赖项。Windows在告诉您找不到某些内容方面并不是非常好,它只会告诉您没有找到某些东西。由您自己来解决这个问题。可以在此处找到Windows DLL搜索路径: http://msdn.microsoft.com/en-us/library/7d83bc18.aspx 在我的情况下,确保所有需要的dll文件都在同一个目录中,并执行os.chdir()到该目录解决了问题。

4
提一下,“os.chdir()”(虽然我不确定这是否是正确的处理问题的方法)在尝试了标记答案中提到的选项后对我有所帮助。 - JavierQQ23
1
使用 os.chdir() 的替代方法是确保包含 dlls 的目录在您的路径中。无论哪种方式,都可以使 Windows 找到 dlls。 - Doo Dah
我有一个非常简单的dll,除了MSVC C++之外没有其他依赖项。它似乎找不到与之链接的内容。我该如何解决? - raaj

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")
使用正斜杠
>>> import ctypes
>>> ctypes.windll.LoadLibrary("c:/tools/depends/depends.dll")

c) 使用原始字符串(在字符串前加上 r)

>>> import ctypes
>>> ctypes.windll.LoadLibrary(r"c:\tools\depends\depends.dll")

虽然第三种方法可以使用 - 但我时不时地会有这样的印象,即它不被认为是“正确”的,因为RAW字符串是为正则表达式而设计的。我在Python中多年来一直将其用于Windows上的路径而没有问题 :)


1
我知道这是一个旧的线程,但我发现在Python 3.6中,这个可以工作。 {print("Adding dll path ",combinedPath)os.environ['PATH'] = ';'.join([os.environ['PATH'], DLLPath])dll = windll.LoadLibrary('D:/projects/trunk/distributed_processing/my_custom_code.dll')} 怎么在答案中换行? - Richard Keene
3
如果路径无效 - 谓词"os.path.exists(dll_path)"将返回False!这个解决方案与问题不相符。 - Azriel Berger
可能是库本身或其依赖项:请参见@Mark Ucka的答案:https://dev59.com/-nI-5IYBdhLWcg3wQWCc#57793866。 - scrutari

7

万一其他人也遇到这个极端特定的问题.. PyTorch内部某些内容会破坏DLL加载。一旦你运行import torch,任何后续的DLL加载都将失败。因此,如果你正在使用PyTorch并加载自己的DLL,你需要重新调整代码,先导入所有的DLL。在Python 3.7上确认过 PyTorch 1.5.0存在该问题。


你不能将此作为问题的答案发布。 - ABGR

3

如果你使用GCC在Windows上进行编译,可能会因为找不到依赖库而导致错误。

使用GCC链接时加上-static标志可能会修复这个问题。


MinGW工具链的更详细的链接器选项:-static-libgcc -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic - scrutari

3

我在32位的Win10操作系统中遇到了同样的问题。通过将DLL从调试版本更改为发布版本,我解决了这个问题。

我认为这是因为调试版本的DLL依赖于其他DLL,而发布版本则没有。


0

0

0
在Windows中,这是可能的。您需要安装:Visual Studio 2015的Visual C++可再发行程序包。我曾经遇到过同样的问题,我安装了两个版本(Windows x86和Windows x64)。显然,这两个版本都是必要的才能使其正常工作。

0
尝试按照@markm提出的不同方式指定dll路径,但对我来说都没有起作用。 通过将dll复制到脚本文件夹中解决了问题。这不是一个好的解决方案,但对我的目的来说还可以。

0

更新bokeh时出现问题:[WinError 126]指定的模块无法找到中有一个很有前途的答案。

它提示了https://github.com/conda/conda/issues/9313

在那里,你会发现:

这是一个库加载问题。更多细节请参见 github.com/conda/conda/issues/8836 您可能现在已经有一个损坏的conda。 您可以使用来自repo.anaconda.com/pkgs/misc/conda-execs的独立conda进行修复: standalone-conda.exe update -p C:\ProgramData\Anaconda3 conda-package-handling 您应该获得版本1.6.0,并且问题 应该消失了。

因此,这可能只是一个conda问题。重新安装独立的conda可能会修复错误。请评论者确认此事。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接