Python чтения DLL бросает OSError: [WinError 126] - PullRequest
0 голосов
/ 24 мая 2018

Я явно не первый, у кого возникла проблема с чтением DLL-файла с python.Такой пример можно найти там WindowsError: [Ошибка 126] при загрузке ОС с ctypes , WindowsError: [Ошибка 126] Указанный модуль не найден или 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 зависит от многих из них ...Есть ли способ узнать, какой из них отсутствует?

1 Ответ

0 голосов
/ 28 мая 2018

Хорошо, благодаря неоднократной помощи от @eryksun и информации об эквивалентной проблеме C ++, описанной здесь, Библиотека загрузки DLL - код ошибки 126 , мне удалось найти, какая dll отсутствовала, но не была загружена.Sysinternal инструмент был большим подспорьем для динамического определения, какой из них отсутствует.И одна ошибка, которую я сделал в то время, состояла в том, чтобы ожидать, что все dll в той же папке будут загружены.На самом деле, DLL загружаются только тогда, когда они находятся в пути Windows.Таким образом, создание папки, содержащей все dll, которые не были решены моей проблемой.

Тем не менее, я глубоко сожалею об отсутствии информации, предоставленной сообщением об ошибке, чтобы сказать, какая dll отсутствовала ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...