Найти - Пользователи
Полная версия: Почему встроенный Python не работает с PYD?
Начало » Python для экспертов » Почему встроенный Python не работает с PYD?
1 2
jkacs
При встраивании Python в приложение столкнулся с проблемой.
Элементарный скрипт, который выполняется без проблем:

import ctypes
print ctypes.__dict__

при таком встраивании в Win приложение:

Py_Initialize();

//PyRun_SimpleString(“import os; print os.__dict__\n”);
PyRun_SimpleString(“import ctypes; print ctypes.__dict__\n”);

Py_Finalize();

дает ошибку

Traceback (most recent call last):
File “<string>”, line 1, in <module>
File “C:\Python25\Lib\ctypes\__init__.py”, line 10, in <module>
from _ctypes import Union, Structure, Array
ImportError: No module named _ctypes


аналогичная строка для модуля os выполняется без проблем.

Такое впечатление, что встроенный Python по разному относится к модулям в py/pyc формате (os) и dll модулям pyd (ctypes)
Сталкивался ли кто-нибудь с такой проблемой?
Андрей Светлов
_ctypes.pyd не находится в ваших sys.path. Встраиваемый Питон делает то же самое, что и стандартный. Только эти пути может чуть иначе настроить
jkacs
_ctypes.pyd находится в C:\Python25\DLL, есть в sys.path и в станлартном и во встраиваемом.

Проблема оказалась в том что еmbedded оказался чувствителен к версии С компилятора!
После перекомпиляции Питона и _ctype ошибка исчезла
Андрей Светлов
А можете подробнее о версии компилятора? Для меня ваше объяснение звучит загадочно.
jkacs
Я вначале использовал оригинальные версии библиотек python25.dll u _ctypes.pyd из инсталлятора pywin32.
Приложение со встроеным Питоном компилировалось в VS2003.
После перекомпиляиции исходников Питона и _ctype также в VS2003 встроенное приложение стало работать с новым _ctypes.pyd.
Андрей Светлов
Чудеса. Python 2.5 и так поставляется собранный VC 7.1 (он же VS 2003).
mrgloom
у меня проблема что импорт модулей где задействованы .pyd файлы работает только в release версии(vs2008) python2.7 сборка стандартная скаченная с сайта, причем python27_d.dll я собирал сам из исходников, но весь питон не понял как собрать, т.е. например откуда должны взяться .pyd файлы для дебаг версии и может буть что то еще отличающееся от простой поставки?
Андрей Светлов

Вы чем пользуетесь? boost применяет трюк с #define/#undef для включения недебажной версии по умолчанию. Смотрите http://svn.boost.org/svn/boost/trunk/boost/python/detail/wrap_python.hpp

mrgloom
я так понимаю моя проблема может быть еще и в том, что .lib файл я использовал от стандартной поставки(release), а не от скомпилированной собственноручно debug версии(.dll подключал python27_d.dll)
так всё таки для debug/release нужно изменять только .lib и .dll или же еще и .pyd файлы? и еще может быть что то в окружении питона?

питон можно собрать статически?

boost.python не пользовался, показалось сложным и я так и не понял он в две стороны работает? т.е. можно и с++ из питона и питон из с++?
ошибки с .pyd файлами воспроизводились даже на PyRun_SimpleString(“import some_module”)
т.е. если some_module в своих импортах не содержит импорт .pyd файлов, то всё норм, если же содержит, то пишет что не может найти какие либо модули(вроде ошибка была с import _socket).
Андрей Светлов

Да, нужно чтобы .lib, .dll и .pyd все вместе использовали или релизную или дебажную сборку. Смешать — не выйдет.

Я когда-то собирал статический питон. Не слишком сложно, но довольно неудобно. DLL удобней. К тому же если у вас питон статический дебажный — то и всё остальное тоже должно быть таким. Как трюк можно использовать релизную сборку с выключенной оптимизацией и сгенерированной отладочной информацией — но это тоже не вполне удобно.

Py_SetProgramName и Py_SetPythonHome вызывали перед Py_Initialize?

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB