Почему этот "из-импорт" не работает с PyRun_SimpleString?

Я работаю над простым (?) встроенным проектом Python. У меня есть собственный пакет, который был установлен в пакеты сайта с установкой setup.py, например:

в C:\Python27\Lib\site-packages \:

mypackage\
 __init__.py
 subpackage\
 __init__.py
 subpackage.py
 .... 
 mymodule.py

код >

Просто выполняя некоторые простые встраивающие вызовы, я получаю некоторое поведение, которое не соответствует тому, что я получаю в окне cmd, на котором запущен Python. В частности:

PyRun_SimpleString("import mypackage") //Success (return == 0)
PyRun_SimpleString("from mypackage import subpackage") //Success
PyRun_SimpleString("from mypackage import mymodule") //Fail (return == -1)

... тогда как все они прекрасно работают в CMD-окне (нет ImportError, и я могу получить ожидаемые результаты, например, dir(mymodule)

Я знаю, что интерпретатор, полученный из Py_Initialize(), немного отличается от того, что вы получаете в окне cmd, особенно sys.path... прочитав некоторые другие ответы на SO, я попытался вставить ' как первый элемент sys.path: PyRun_SimpleString("import sys\nsys.path.insert(0,'')") до неудачного импорта, но не повезло, все равно возвращает -1. Также попытался добавить sys.path с 'C:\Python27\Lib\site-packages\mypackage', но до сих пор не удалось импортировать 'mymodule' (mymodule.py).

Основываясь на других примерах на SO и других сайтах, я попробовал несколько вариантов импорта, например.

__import__('mypackage',globals(), locals(), fromlist=['mymodule'])
__import__('mypackage.mymodule',globals(), locals(), fromlist=['mymodule'])

Также попробовал PyImport_ImportModuleEx и как с PyRun_SimpleString, он работал для всего, кроме "из mypackage import mymodule".

Кроме того: этот сценарий отлично работает под MacOS/Python 2.7. Это просто под Windows, что он не работает.

Любые идеи, где это могло бы сходить с рельсов?

UPDATE: дополнительная информация: "subpackage.py" импортирует библиотеку расширений (позвольте ей "utilites.pyd" ). Я могу импортировать другие ".py" модули, которые не импортируют это.

1 ответ

Принимая редкую возможность ответить на мой собственный вопрос...

Как только я сузил проблему до модулей, которые импортировали расширение utilities.pyd, я некоторое время искал инструмент Dependency Walker и обнаружил, что произошла ошибка при загрузке MSVCR90.DLL(файл не найден). В старые времена вы могли бы просто отбросить эту DLL в свой путь приложения, и это, как правило, будет работать.

Но в настоящее время (Vista и после) это немного более активно. После прочтения этого интересного сообщения в блоге о более старой библиотеке MSVCR я решил, что попробую обновить раздел манифеста моего .pyd файла чтобы указать на тот же MSVCR90.DLL, что и Python27.DLL, который находится в папке \Windows\WinSxS (бок о бок).

После этого он работал как шарм. Теперь мне просто нужно выяснить, как автоматически включать секцию зависимостей во время python setup.py mypackage, но этот еще один вопрос: -)

licensed under cc by-sa 3.0 with attribution.