загрузить pyd файлы из zip из встроенного питона - PullRequest
6 голосов
/ 22 декабря 2011

Я могу загрузить модули Python (.py, .pyc, .pyd) из zip-файла, вызвав "import some_module" из интерпретатора Python только после расширения sys.path для включения zip-файла и только после того, как я бегу

import zipextimporter
zipextimporter.install()

Последнее требуется для модулей .pyd.

Я также могу загрузить модули Python .py и .pyc из Python, встроенного в C ++. Однако, чтобы также загрузить модули .pyd из встроенного Python, я добавил

PyRun_SimpleString("import zipextimporter");

C ++ exe работает без этой строки без ошибок. Но следующая команда

PyRun_SimpleString("zipextimporter.install()");

дает мне эту ошибку:

enter image description here

Почему zipextimporter.install () аварийно завершает работу, когда Python встроен?

Как я могу решить это?

Возможно, это связано с тем, как код на C ++ компилируется? Я использую g ++:

g++ embed-simple.cpp -IE:\Python27\include -LE:\Python27\libs -lpython27 -o embed-simple

Я видел ссылку Как связать msvcr90.dll с mingw gcc?

Может ли это дать решение? Если да, то как мне это настроить, gcc -> g ++, поскольку я использую код C ++, а не C.

Я использую Python 2.7.2 на WinXP.

После чистой установки Python 2.7.2 я не получаю ошибку времени выполнения, просто вот так:

Ошибка импорта: модуль не указан ....

Будет ли иметь значение способ компиляции встроенного сценария C ++? Я использовал g ++. Я также скомпилирован с помощью компилятора Intel, но это дало ту же ошибку времени выполнения Возможно, мне стоит попробовать MS Visual C ++.

Или использовать ctypes для импорта pyd?

Ответы [ 4 ]

5 голосов
/ 29 декабря 2011

memimporter и zipextimporter действительно могут загружать файлы .pyd из памяти / zip-архивов без распаковки их в файлы.

Runtimerror R6034 вызван тем, что библиотека времени выполнения VC9 должна быть загружена черезманифест.Выполнение вашего кода в Python 2.5, в котором используется другая среда выполнения C, скорее всего будет успешным.Я полагаю, вы должны встроить манифест со ссылкой на библиотеку времени выполнения VC9 в вашем exe;может быть, вики py2exe может дать некоторые рекомендации.

4 голосов
/ 22 декабря 2011

PYD-файлы являются собственными DLL-файлами с переименованным расширением.Их загрузка зависит от возможностей операционной системы и ограничений операционной системы.

Windows XP или любая другая операционная система, насколько я знаю, не может загружать файлы DLL из ZIP-файлов, поэтому вы не можете загружать файлы PYD из файлов ZIP.

2 голосов
/ 20 марта 2012

это похоже на те же проблемы, с которыми я столкнулся при компиляции приложения с py2exe.см. здесь: http://www.py2exe.org/index.cgi/Tutorial, см. раздел 5.2.То же самое происходит ... при первой попытке использовать memimporter происходит сбой с аналогичным сообщением об ошибке.В основном, для python 2.6+ вам нужна точная версия библиотеки времени выполнения в пути и манифест, указывающий на нее.Так как вы используете встроенный Python, я не знаю, как все это работает, но, возможно, это приблизит вас.

Я бы начал с того, что где-то поместил бы 'правильную' версию DLL времени выполненияВаш код Python, прежде чем импортировать zipextimporter, добавит путь правильной среды выполнения к sys.path и посмотрим, исправит ли это.не уверен, как вы получите там манифест для встроенного питона.возможно, его необходимо включить в манифест родительского приложения.

edit: Кстати, я забыл, мы нашли другой способ обойти эту проблему.Я забыл точные детали, но происходит то, что ваше приложение загружает версию среды выполнения по умолчанию, а затем python запрашивает ее версию, и она находит ее в c: \ python {26,27}, и она не совпадает.Самый простой способ решить эту проблему - удалить c: \ python \ msvcr90.dll.Тогда python не попадет в локальную (старую) версию dll, которая может не работать с манифестом вашего приложения, и им обоим придется выйти и получить текущую версию из каталога windows, что будет соответствовать.

2 голосов
/ 22 декабря 2011

Для какой версии python был скомпилирован memimporter.pyd (который находится внутри zipextimporter)? Если интерпретатор python и pyd не совпадают, вы получите ужасные сбои.

Я не уверен, где находится код импортера mem, но мне кажется, что идея состоит в том, чтобы вставить ловушку импорта, которая обнаруживает импорт pyd на основе zip, извлекает pyd во временное местоположение и вызывает Стандартный импорт интерпретатора Python для этого.

...