Могу ли я использовать сгенерированный код Swig для преобразования объекта C ++ в PyObject? - PullRequest
3 голосов
/ 01 мая 2011

Я работаю над встраиванием python в мою программу на C ++, используя swig. На данный момент у меня есть объект, написанный на C ++, который я хочу передать функции Python. Я создал интерфейс Swig, чтобы обернуть класс.

Что я пытаюсь сделать, так это взять созданный мной объект C ++ и передать его функции python с возможностью использовать его так же, как в C ++. Могу ли я использовать для этого код, сгенерированный swig? Если нет, то как я могу подойти к этому?

1 Ответ

2 голосов
/ 01 мая 2011

Вы можете использовать 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;
}

Я думаю У меня есть право подсчета ссылок для этого, но я не совсем уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...