jkacs
Фев. 15, 2010 21:48:19
При встраивании 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)
Сталкивался ли кто-нибудь с такой проблемой?
Андрей Светлов
Фев. 16, 2010 18:40:55
_ctypes.pyd не находится в ваших sys.path. Встраиваемый Питон делает то же самое, что и стандартный. Только эти пути может чуть иначе настроить
jkacs
Фев. 18, 2010 21:33:37
_ctypes.pyd находится в C:\Python25\DLL, есть в sys.path и в станлартном и во встраиваемом.
Проблема оказалась в том что еmbedded оказался чувствителен к версии С компилятора!
После перекомпиляции Питона и _ctype ошибка исчезла
Андрей Светлов
Фев. 19, 2010 06:18:55
А можете подробнее о версии компилятора? Для меня ваше объяснение звучит загадочно.
jkacs
Фев. 19, 2010 21:03:17
Я вначале использовал оригинальные версии библиотек python25.dll u _ctypes.pyd из инсталлятора pywin32.
Приложение со встроеным Питоном компилировалось в VS2003.
После перекомпиляиции исходников Питона и _ctype также в VS2003 встроенное приложение стало работать с новым _ctypes.pyd.
Андрей Светлов
Фев. 20, 2010 05:18:31
Чудеса. Python 2.5 и так поставляется собранный VC 7.1 (он же VS 2003).
mrgloom
Июнь 25, 2012 10:25:08
у меня проблема что импорт модулей где задействованы .pyd файлы работает только в release версии(vs2008) python2.7 сборка стандартная скаченная с сайта, причем python27_d.dll я собирал сам из исходников, но весь питон не понял как собрать, т.е. например откуда должны взяться .pyd файлы для дебаг версии и может буть что то еще отличающееся от простой поставки?
Андрей Светлов
Июнь 26, 2012 22:16:45
Вы чем пользуетесь? boost применяет трюк с #define/#undef для включения недебажной версии по умолчанию.
Смотрите http://svn.boost.org/svn/boost/trunk/boost/python/detail/wrap_python.hpp
mrgloom
Июнь 27, 2012 12:27:25
я так понимаю моя проблема может быть еще и в том, что .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).
Андрей Светлов
Июнь 27, 2012 20:16:28
Да, нужно чтобы .lib, .dll и .pyd все вместе использовали или релизную или дебажную сборку. Смешать — не выйдет.
Я когда-то собирал статический питон. Не слишком сложно, но довольно неудобно. DLL удобней. К тому же если у вас питон статический дебажный — то и всё остальное тоже должно быть таким. Как трюк можно использовать релизную сборку с выключенной оптимизацией и сгенерированной отладочной информацией — но это тоже не вполне удобно.
Py_SetProgramName и Py_SetPythonHome вызывали перед Py_Initialize?