Python读取DLL抛出OSError:[WinError 126]

时间:2018-05-24 18:34:27

标签: python windows

我显然不是第一个使用python读取.dll文件有问题的人。可以在WindowsError: [Error 126] when loading a OS with ctypesWindowsError: [Error 126] The specified module could not be foundhttps://github.com/apache/incubator-mxnet/issues/6313找到此类示例。 知道了问题的扩展,我检查了我的dll的路径是否正确。我甚至做了一个小的python脚本来对它进行最低限度的测试,添加了我能想到的所需路径:

import sys
import os
from ctypes import *

if __name__ == '__main__':
    print(sys.path)
    sys.path.append(r"C:\Program Files (x86)\OpenBLAS\bin")
    pathWin = os.environ["PATH"]
    pathWin = pathWin.split(";")
    sys.path = sys.path + pathWin
    print(sys.path)
    dllToLoad = "F:/installMxnet/mxnet/build/Debug/libmxnet.dll"
    cdll.libmxnet = cdll.LoadLibrary(dllToLoad)

我仍然以此错误结束:

Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.1\helpers\pydev\pydevd.py", line 1664, in <module>
    main()
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.1\helpers\pydev\pydevd.py", line 1658, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.1\helpers\pydev\pydevd.py", line 1068, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.1\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "main.py", line 16, in <module>
    cdll.libmxnet = cdll.LoadLibrary(dllToLoad)
  File "C:\Users\educrocq\AppData\Local\Programs\Python\Python36\lib\ctypes\__init__.py", line 426, in LoadLibrary
    return self._dlltype(name)
  File "C:\Users\educrocq\AppData\Local\Programs\Python\Python36\lib\ctypes\__init__.py", line 348, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 126] The specified module could not be found

根据我读到的内容,可能是因为dll具有无法找到的依赖关系。 (而且我猜想,找不到依赖关系的依赖会引发同样的问题,等等......)。似乎问题来自Windows,它的输出消息并不详细。

但是我需要知道在我的情况下找不到哪个dll,因为这个dll取决于它们中的很多...有没有办法让哪一个丢失?

1 个答案:

答案 0 :(得分:1)

好的,感谢@eryksun的反复帮助和来自此处解释的C ++等效问题的信息DLL Load Library - Error Code 126,我设法找到哪个dll丢失但未加载。 sysinternal工具非常有助于动态了解缺少哪一个。 我当时做的一个错误是期望同一文件夹中的每个dll都会被加载。实际上,只有当它们位于Windows路径中时才会加载dll。因此,创建一个包含所有未解决的dll的文件夹。

但是,我对错误消息提供的信息缺乏告诉哪个dll丢失感到非常遗憾......