Уведомления

Группа в Telegram: @pythonsu

#1 Июль 1, 2011 00:10:32

HexRx
От:
Зарегистрирован: 2010-09-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Boost 1.47 beta 1 C++ embedding Python 3.2 ошибка импорта

Доброй ночи! Пытаюсь сделать банальную вещь, вызвать C++ класс из под питона

class Sample
{
public:
void ShowMessage(std::string msg)
{
printf("%s", msg);
}
};

BOOST_PYTHON_MODULE(SampleModule)
{
class_<Sample>("SampleClass")
.def("ShowMessage", &Sample::ShowMessage);
}

int main(int argc, char* argv[])
{
Py_Initialize();

// Не знаю нунжно ли это ;)
init_module_SampleModule();

object main = import("__main__");
object global(main.attr("__dict__"));

try
{
object result = exec(
"import SampleModule \n"
"sample = SampleModule.SampleClass() \n"
"sample.ShowMessage('Test string')",
global);
}
catch(error_already_set) {
PyErr_Print();
}

Py_Finalize();
return 0;
}
Выпадает ошибка
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named SampleModule
Чего в этом коде еще нахватает?
Заранее благодарен :)



Офлайн

#2 Июль 1, 2011 08:20:15

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Boost 1.47 beta 1 C++ embedding Python 3.2 ошибка импорта

class Sample
{
public:
void ShowMessage(std::string msg)
{
printf("%s", msg);
}
};

BOOST_PYTHON_MODULE(SampleModule)
{
class_<Sample>("SampleClass")
.def("ShowMessage", &Sample::ShowMessage);
}

int main(int argc, char* argv[])
{
PyImport_AppendInittab("SampleModuke, init_module_SampleModule);
Py_Initialize();

// Не знаю нунжно ли это ;)
// init_module_SampleModule();

object main = import("__main__");
object global(main.attr("__dict__"));

try
{
object result = exec(
"import SampleModule \n"
"sample = SampleModule.SampleClass() \n"
"sample.ShowMessage('Test string')",
global);
}
catch(error_already_set) {
PyErr_Print();
}

Py_Finalize();
return 0;
}
Embedding — зло.



Офлайн

#3 Июль 1, 2011 11:49:04

HexRx
От:
Зарегистрирован: 2010-09-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Boost 1.47 beta 1 C++ embedding Python 3.2 ошибка импорта

Андрей Светлов, спасибо за наставление на путь истинный! :D
Тут оказалось что в питоне 3.2, PyImport_AppendInittab вторым параметром принимает PyObject* (*initfunc)(void).
Гуглил-гуглил, так что-то нечего путевого не нашел, но потом случайно в выпадающем списке в студии нашел PyInit_SampleModule.

Андрей Светлов
Embedding — зло.
Полезное зло.



Офлайн

#4 Июль 1, 2011 12:45:10

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Boost 1.47 beta 1 C++ embedding Python 3.2 ошибка импорта

Не очень-то и полезное. Куда проще вести разработку как extending, сделав в последний момент «запускач» если нужно.
Поверьте, я пробовал оба способа. При embedding приходится прилагать нетривиальные усилия чтобы завести интерактивную консоль с отладчиком.



Офлайн

#5 Июль 1, 2011 13:41:01

HexRx
От:
Зарегистрирован: 2010-09-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Boost 1.47 beta 1 C++ embedding Python 3.2 ошибка импорта

Андрей Светлов, спасибо за совет. Правильно ли я понял, “extending” - это написание модуля для питона?



Офлайн

#6 Июль 1, 2011 13:59:27

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Boost 1.47 beta 1 C++ embedding Python 3.2 ошибка импорта

Да embedding — встраивание Питона в свою программу.
Extending — написание Python C Extensions, pyd файлы для Windows.



Офлайн

#7 Июль 1, 2011 14:31:37

HexRx
От:
Зарегистрирован: 2010-09-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Boost 1.47 beta 1 C++ embedding Python 3.2 ошибка импорта

Андрей Светлов, спасибо за оперативный ответ.



Офлайн

#8 Июль 1, 2011 14:52:05

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Boost 1.47 beta 1 C++ embedding Python 3.2 ошибка импорта

Пожалуйста



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version