Найти - Пользователи
Полная версия: Boost 1.47 beta 1 C++ embedding Python 3.2 ошибка импорта
Начало » Python для новичков » Boost 1.47 beta 1 C++ embedding Python 3.2 ошибка импорта
1
HexRx
Доброй ночи! Пытаюсь сделать банальную вещь, вызвать 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
Чего в этом коде еще нахватает?
Заранее благодарен :)
Андрей Светлов
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 — зло.
HexRx
Андрей Светлов, спасибо за наставление на путь истинный! :D
Тут оказалось что в питоне 3.2, PyImport_AppendInittab вторым параметром принимает PyObject* (*initfunc)(void).
Гуглил-гуглил, так что-то нечего путевого не нашел, но потом случайно в выпадающем списке в студии нашел PyInit_SampleModule.
Андрей Светлов
Embedding — зло.
Полезное зло.
Андрей Светлов
Не очень-то и полезное. Куда проще вести разработку как extending, сделав в последний момент «запускач» если нужно.
Поверьте, я пробовал оба способа. При embedding приходится прилагать нетривиальные усилия чтобы завести интерактивную консоль с отладчиком.
HexRx
Андрей Светлов, спасибо за совет. Правильно ли я понял, “extending” - это написание модуля для питона?
Андрей Светлов
Да embedding — встраивание Питона в свою программу.
Extending — написание Python C Extensions, pyd файлы для Windows.
HexRx
Андрей Светлов, спасибо за оперативный ответ.
Андрей Светлов
Пожалуйста
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