Подтвердить что ты не робот

Передать обратный вызов из 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, но он не компилировался и не был актуальным, я не мог понять, как его использовать.

4b9b3361

Ответ 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 вызывается из С++ и выполняется, как ожидалось.