我使用以下代码在python中加载一个DLL:
if os.path.exists(dll_path):
my_dll = ctypes.cdll.LoadLibrary(dll_path)
Run Code Online (Sandbox Code Playgroud)
但我不断收到以下错误
WindowsError:[错误126]找不到指定的模块
dll出现在指定的路径上,但我不明白为什么我收到错误.
Doo*_*Dah 26
请注意,即使DLL在您的路径中.如果该DLL依赖于路径中不存在的其他DLL,则可能会出现相同的错误.在这种情况下,Windows无法找到依赖项.Windows并不是真的善于告诉你它找不到的东西,只是它找不到东西.由你决定这一点.可以在此处找到Windows DLL搜索路径:http: //msdn.microsoft.com/en-us/library/7d83bc18.aspx
在我的情况下,确保所有需要的dll都在同一个目录中,并对该目录执行os.chdir()解决了问题.
mar*_*rkm 16
当我看到这样的事情时 - 通常是因为路径中有反斜杠被转换.
例如 - 以下内容将失败 - 因为字符串中的\ 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
Run Code Online (Sandbox Code Playgroud)
有3个解决方案(如果这是问题)
a)使用双斜线......
>>> import ctypes
>>> ctypes.windll.LoadLibrary("c:\\tools\\depends\\depends.dll")
Run Code Online (Sandbox Code Playgroud)
b)使用正斜杠
>>> import ctypes
>>> ctypes.windll.LoadLibrary("c:/tools/depends/depends.dll")
Run Code Online (Sandbox Code Playgroud)
c)使用RAW字符串(用r表示字符串
>>> import ctypes
>>> ctypes.windll.LoadLibrary(r"c:\tools\depends\depends.dll")
Run Code Online (Sandbox Code Playgroud)
虽然这第三个有效 - 但我不时觉得它不被认为是'正确',因为RAW字符串是用于正则表达式的.多年来我一直用它在Python上的路径上没有问题:))
小智 6
万一其他人遇到这个非常具体的问题.. PyTorch 内部的某些东西会破坏 DLL 加载。一旦运行import torch,任何进一步的 DLL 加载都将失败。因此,如果您使用 PyTorch 并加载自己的 DLL,则必须重新排列代码以首先导入所有 DLL。在 Python 3.7 上使用 PyTorch 1.5.0 确认