ImportError при использовании только IPython - PullRequest
0 голосов
/ 29 октября 2018

У меня есть скомпилированный модуль .pyd, который опирается на несколько других библиотек DLL (Python mapscript и MapServer), и я пытаюсь использовать его в IPython в Windows 10. Для настройки выполните следующие действия:

  • Создано новое виртуальное окружение
  • установлен mapScript для среды
  • установить PATH для включения папки, содержащей библиотеки MapServer
  • "import mapscript" отлично работает при запуске с использованием стандартного venv Python
  • при запуске ipython и запуске «import mapscript» я получаю следующую ошибку: ImportError: DLL load failed: The specified procedure could not be found.

Шаги отладки на данный момент:

  • sys.executable в обоих случаях идентичен (venv Python и venv IPython)
  • os.environ ["PATH"] идентично
  • sys.path в ipython имеет в конце несколько дополнительных путей в IPython - C:\Users\user\.ipython и 'c: \ virtualenvs \ mapscript-jupyter3 \ lib \ site-packages \ IPython \ extensions', но в остальном они идентичны. Удаление этих путей не изменит ошибку.
  • Я попытался найти отсутствующую DLL с помощью Process Monitor, но все они, похоже, найдены.

Та же проблема возникает как в Python 2.7, так и в Python 3.6 с недавно созданными venvs. Кажется, проблема в том, что ноутбук ipython может импортировать модуль pyd, но интерпретатор python не может

Поэтому мой вопрос заключается в том, что делает IPython со средой Python, которая может вызвать различия со стандартным Python и вызвать ImportError?

1 Ответ

0 голосов
/ 31 октября 2018

Потребовалось некоторое время, чтобы найти проблему. Любые недостающие библиотеки DLL легко обнаружить с помощью Process Monitor . Однако в этом случае были найдены все зависимые библиотеки DLL, но в одной из них не было функции, используемой файлом .pyd (или связанными библиотеками DLL), которые я пытался импортировать.

Мне удалось сузить тест до 2 команд, которые вызвали ошибку - загрузить PYD напрямую.

python -c "import _mapscript"
ipython -c "import _mapscript"

Я попытался удалить / изменить PATH в и из виртуальных сред, и py2 и py3, и все выдало одну и ту же ошибку.

Затем я попытался запустить Process Monitor и сравнить результаты - ничего, кроме ipython, не загружает множество дополнительных библиотек Python для интерактивной оболочки.

Process Monitor включает удобную опцию Properties для каждого события, которая также показывает, какие модули загружены для Process. Их можно отсортировать, а затем скопировать в буфер обмена.

Loaded Modules

Мне удалось сравнить выходные данные работающего Python и поврежденных процессов IPython. IPython включает несколько дополнительных файлов .pyd из корневой установки Python (C:\Python36\DLLs). Я знал, что pyd, который я пытался загрузить, использовал sqlite, и это был один из загруженных модулей (предположительно, поскольку IPython хранит все входные команды в базе данных sqlite для легкого доступа к истории). Временное удаление файла _sqlite3.pyd позволило загрузить модуль.

Папка Python DLLs имеет приоритет над папками в PATH, поэтому текущим исправлением было заменить sqlite3.dll в папке Python DLL на тот, который использовался MapServer, и все работало правильно.

...