Передать обратный вызов из python в С++ с помощью boost:: python
Я хочу передать обратный вызов из моего кода python в С++
Я хочу, чтобы мой код выглядел примерно так:
В С++:
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 и С++ есть советы по использованию boost:: python и предупреждения о GLI, но нет примеров.
И здесь
Как вызвать функцию python из потока на иностранном языке (С++) нет полного описания с частью кода python и с частью BOOST_PYTHON_MODULE
Я также нашел ссылку для использования py_boost_function.hpp, например, в Boost python howto, но он не компилировался и не был актуальным, я не мог понять, как его использовать.
Ответы
Ответ 1
Хорошо, я все еще пытаюсь понять это, но вот что работает для меня до сих пор:
#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 вызывается из С++ и выполняется, как ожидалось.