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