Pybind11: «ImportError: DLL не найдена» при попытке импортировать * .pyd в Python Интерпретатор - PullRequest
1 голос
/ 22 января 2020

Я собрал .pyd в Visual Studio 2019 (Community), который предоставляет оболочку для некоторых функций, присутствующих только в LibRaw. Решение успешно компилируется без каких-либо предупреждений или ошибок. В проекте используются LibRaw, OpenCV и pybind11, а также Python.h и соответствующий .lib -файл.

Когда я пытаюсь импортировать .pyd в интерпретаторе Python, я получаю:

C:\Users\Tim.Hilt\source\repos\cr3_converter\Release>dir
 Datenträger in Laufwerk C: ist Acer
 Volumeseriennummer: EC36-E45E

 Verzeichnis von C:\Users\Tim.Hilt\source\repos\cr3_converter\Release

22.01.2020  11:28    <DIR>          .
22.01.2020  11:28    <DIR>          ..
22.01.2020  11:28               808 cr3_converter.exp
22.01.2020  11:28         3.068.361 cr3_converter.iobj
22.01.2020  11:28           785.552 cr3_converter.ipdb
22.01.2020  11:28             1.908 cr3_converter.lib
22.01.2020  11:28         4.190.208 cr3_converter.pdb
22.01.2020  11:28           953.856 cr3_converter.pyd
31.10.2019  16:22        26.408.085 IMG_0482_raw.CR3
               7 Datei(en),     35.408.778 Bytes
               2 Verzeichnis(se), 77.160.587.264 Bytes frei

C:\Users\Tim.Hilt\source\repos\cr3_converter\Release>python
Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 22:39:24) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cr3_converter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: DLL load failed while importing cr3_converter: The specified module was not found.
>>> import cr3_converter.pyd
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: DLL load failed while importing cr3_converter: The specified module was not found.
>>>

Пути к нужным .dlls (Python и OpenCV в этом случае; LibRaw был полностью статически связан) установлены в системном пути.

Я запустил Dependency-Walker, но не смог найти ничего подозрительного. Вот соответствующее изображение Ходока Зависимости . Я также опробовал другой инструмент ( Dependencies.exe , который по сути является переписанным Dependency Walker, но учитывает API-MS-WIN-CORE-....dlls) и получил ошибку, которая выглядела так:

enter image description here

При наведении курсора на пропущенный .dll я вижу api-ms-win... module could not be found on disk. Я искал и нашел модуль и добавил его путь к каталогу к системному пути. Теперь модуль больше не выделяется красным, но C:\WINDOWS\SysWOW64\WS2_32.dll (красная подсветка вверху скриншота) по-прежнему показывает отсутствие импорта. Может ли это быть проблемой?

Как я создал .pyd:

  • Создан пустой проект Visual Studio (Win32; Python также 32-битная установка) )
  • Изменены настройки проекта на .dll -configuration и .pyd -fileextension
  • Добавлены include-пути к файлам заголовков для OpenCV, LibRaw и Pybind11
  • Добавлены пути и входные файлы для компоновщика для OpenCV, LibRaw и Python3 .8
  • Построение решения (без ошибок, без предупреждений)
  • Попытка импортировать .pyd в python -interpreter

Я видел этот вопрос , где у ОП возникла проблема с загрузкой библиотекой разных Python - .dlls, но в моем case библиотека, на которую ссылается Dependency Walker, такая же, как у меня в моей переменной пути.

1 Ответ

2 голосов
/ 23 января 2020

Я спокойно предположил, что Windows ищет .dll s в тех же каталогах, что и перечисленные в системах (/ users) PATH -variable.

Однако это не случай, как ProcMon выявлено. Пока я скопировал недостающие .dll s в папку, содержащую .pyd, и все работает.

...