我显然不是第一个使用python读取.dll文件有问题的人。可以在WindowsError: [Error 126] when loading a OS with ctypes,WindowsError: [Error 126] The specified module could not be found或https://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取决于它们中的很多...有没有办法让哪一个丢失?
答案 0 :(得分:1)
好的,感谢@eryksun的反复帮助和来自此处解释的C ++等效问题的信息DLL Load Library - Error Code 126,我设法找到哪个dll丢失但未加载。 sysinternal工具非常有助于动态了解缺少哪一个。 我当时做的一个错误是期望同一文件夹中的每个dll都会被加载。实际上,只有当它们位于Windows路径中时才会加载dll。因此,创建一个包含所有未解决的dll的文件夹。
但是,我对错误消息提供的信息缺乏告诉哪个dll丢失感到非常遗憾......