Файл *.pyd не загружается, но DependancyWalker работает без ошибок, а ProcMon показывает, что он загружен.

Я пытаюсь загрузить *.pyd с помощью Python, но получаю известную ошибку «Ошибка импорта: ошибка загрузки DLL: указанная процедура не найдена». ошибка.

Я уже сделал следующее:

1.) Исследовал *.pyd с помощью Dependency Walker. GPSVC.DLL и IESHIMS.DLL оказались отсутствующими, но загружены с задержкой, IEFRAME.DLL также обнаружила отсутствие экспорта, но также была загружена с задержкой. Насколько я понимаю, они не используются и в любом случае загружаются с задержкой, поэтому они не должны быть проблемой.

2.) Выполнил «импорт foo» на foo.pyd в командном окне python под наблюдением ProcMon. ProcMon показывает событие "LoadImage" на "foo.pyd" с результатом SUCCESS.

Похоже, это означает, что файл *.pyd загружен правильно.

Итак, что мне не хватает. Моя диагностика Windows говорит мне, что все в порядке, но python говорит мне, что вещь не может быть загружена (обычно из-за отсутствия dll или символа).

Идеи?

Спасибо!


person Transformer2    schedule 14.04.2011    source источник
comment
ОБНОВЛЕНИЕ: я создал небольшую программу для выполнения LoadLibrary() для рассматриваемого *.pyd. Вывод показывает, что *.pyd загружается правильно, и его зависимости (которые без *.pyd не нужны программе) также были подобраны и загружены правильно.   -  person Transformer2    schedule 15.04.2011
comment
Для справки в будущем: Dependency Walker устарел, предпочтительно использовать зависимости: github.com/lucasg/Dependencies   -  person Alexandr Zarubkin    schedule 19.10.2020


Ответы (3)


Является ли файл .pyd той же версией Python, которую вы используете? Загрузка файла .pyd для неправильной версии Python может привести к появлению этого сообщения об ошибке.

Dependency Walker может показать вам, на какую pythonNN.dll он ссылается.

person Baffe Boyois    schedule 14.04.2011
comment
Вроде та же версия. Во всей документации указано, что он работает с Python 2.6, который я использую. И Dependency Walker также показывает, что он связан с Python26.dll. - person Transformer2; 15.04.2011
comment
Различные версии python26.dll. В этом была проблема. - person Transformer2; 17.04.2011

Если у вас есть файл foo.pyd, для успешного выполнения import foo должна существовать доступная извне функция с именем initfoo. Dependency Walker покажет это (как правило, ЕДИНСТВЕННУЮ функцию), если оно существует. Python должен вызывать initfoo для инициализации модуля foo.

Примечание. Я бы ожидал более явного сообщения об ошибке, если бы это было проблемой:

>>> import fubar
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initfubar)
>>>

Вы говорите, что «пытаетесь загрузить файл *.pyd». Это просто странный способ описания import foo или что-то другое?

Вы создали pyd? Если нет, то кто? Вы спрашивали их? Доступен ли этот pyd в Интернете, чтобы другие могли попытаться загрузить/импортировать его?

person John Machin    schedule 14.04.2011
comment
Другая возможность заключается в том, что одна из отсутствующих библиотек DLL с отложенной загрузкой на самом деле требуется для функции инициализации. - person ncoghlan; 15.04.2011
comment
Спасибо за ваш вклад. *.pyd правильно определяет initfoo, это ЕДИНСТВЕННАЯ функция в *.pyd (как вы описываете). Сообщение об ошибке не является более явным, указывая на то, что сбой произошел в системе загрузки Windows dll, где python не может определить, где произошел сбой загрузки. - person Transformer2; 16.04.2011

Хорошо, вот ответ:

Диагностика Windows (зависит, procmon и т. д.) показывала загрузку DLL (или pyd) нормально.

Python показывал, что он не загружается нормально.

Я обнаружил, что инструменты Windows ссылались на другую Python26.dll, скрытую в моей папке C:\Window\SysWOW64.

Эта вторая Python26.dll (найденная в SysWOW64) имеет символ, отсутствующий в основной python26.dll (установленной установщиком Python для Windows, найденной в C:\Python26).

Этот символ "_PyByteArray_empty_string", очевидно, был нужен моему файлу *.pyd.

Итак, при загрузке через диагностику Windows была найдена dll SysWOW64, и *.pyd загрузился правильно. При загрузке с python была обнаружена dll в C:\Python26\, отсутствовал символ и загрузка не удалась.

Так вот ПОЧЕМУ проблема проявилась. Теперь возникает вопрос: почему существуют две версии Python26.dll, одна с _PyByteArray_empty_string, а другая без?

Я использую Python 2.6.6. Возможно, этот символ удален в версии 2.6.6, но присутствует в какой-то более старой версии 2.6.x?

person Transformer2    schedule 16.04.2011