передать обратный вызов из Python в C ++, используя boost :: python - PullRequest
24 голосов
/ 26 августа 2011

Я хочу передать обратный вызов из моего кода Python в C ++

Я хочу, чтобы мой код выглядел примерно так: В C ++:

typedef void (*MyCallback_t) (CallbackInfo);

class MyClass
{...
   void setcallback(MyCallback_t cb);
 ...
}

И чтобы использовать его в Python:

import mylib

def myCallback(mylib_CallbackInfo):
...

t = mylib.MyClass()
t.setcallback(myCallback)

Я видел некоторые темы, связанные с моей проблемой, но не мог ее решить

Например, здесь: Обработка в реальном времени и обратные вызовы с Python и C ++ есть совет использовать boost :: python и предупреждение о GLI, но примеров нет. И вот

Как вызвать функцию Python из потока иностранного языка (C ++) Полное описание с частью кода Python и с частью "BOOST_PYTHON_MODULE" отсутствует

Я также нашел ссылку на использование py_boost_function.hpp, например, в Boost python howto , но он не скомпилирован, и я не мог понять, как его использовать.

1 Ответ

19 голосов
/ 30 сентября 2011

Хорошо, я все еще пытаюсь это выяснить, но вот что у меня работает до сих пор:

#this is the variable that will hold a reference to the python function
PyObject *py_callback;

#the following function will invoked from python to populate the call back reference
PyObject *set_py_callback(PyObject *callable)
{
    py_callback = callable;       /* Remember new callback */
    return Py_None;
}
...
#Initialize and acquire the global interpreter lock
PyEval_InitThreads();

#Ensure that the current thread is ready to call the Python C API 
PyGILState_STATE state = PyGILState_Ensure();

#invoke the python function
boost::python::call<void>(py_callback);

#release the global interpreter lock so other threads can resume execution
PyGILState_Release(state);

Функция python вызывается из C ++ и выполняется, как и ожидалось.

...