* .pyd файл не загружается, но DependancyWalker приходит чистым, и ProcMon показывает, что он загружен - PullRequest
4 голосов
/ 14 апреля 2011

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

Я уже проделал следующее:

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

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

Это, кажется, означает, что файл * .pyd загружен правильно.

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

Идеи?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 15 апреля 2011

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

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

1 голос
/ 16 апреля 2011

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

Диагностика Windows (зависит, procmon и т. Д.) Показала, что DLL (или pyd) нормально загружается.

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

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

Этот второй файл Python26.dll (находится в SysWOW64) имеетсимвол, который отсутствует в основном файле python26.dll (установлен установщиком Windows Python, находится в 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?

1 голос
/ 15 апреля 2011

Если у вас есть файл foo.pyd, для успешного выполнения import foo должна существовать внешне доступная функция с именем initfoo.Dependency Walker покажет это (обычно ЕДИНСТВЕННАЯ функция), если она существует.initfoo должен вызываться Python для инициализации модуля 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 в Интернете, чтобы другие могли попытаться загрузить / импортировать его?

...