我正在使用swig将python嵌入到我的C ++程序中。目前我有一个用C ++编写的对象,我想传递给python函数。我已经创建了swig接口来包装类。
我想要做的就是把我创建的这个C ++对象传递给python函数,并且可以像在C ++中那样使用它。 我可以使用swig生成的代码来执行此操作吗?如果不是,我该如何处理?
答案 0 :(得分:2)
您可以使用PyObject_CallMethod将新创建的对象传递回python。假设ModuleName.object
是一个python对象,其中有一个名为methodName
的方法,你想要传递一个新创建的C ++对象,你想粗略地(从内存中,我现在无法测试它)执行此操作C ++:
int callPython() {
PyObject* module = PyImport_ImportModule("ModuleName");
if (!module)
return 0;
// Get an object to call method on from ModuleName
PyObject* python_object = PyObject_CallMethod(module, "object", "O", module);
if (!python_object) {
PyErr_Print();
Py_DecRef(module);
return 0;
}
// SWIGTYPE_p_Foo should be the SWIGTYPE for your wrapped class and
// SWIG_POINTER_NEW is a flag indicating ownership of the new object
PyObject *instance = SWIG_NewPointerObj(SWIG_as_voidptr(new Foo()), SWIGTYPE_p_Foo, SWIG_POINTER_NEW);
PyObject *result = PyObject_CallMethod(python_object, "methodName", "O", instance);
// Do something with result?
Py_DecRef(instance);
Py_DecRef(result);
Py_DecRef(module);
return 1;
}
我想我的参考计数是正确的,但我不完全确定。