pase la devolución de llamada de python a c++ usando boost:: python
callback boost-python (1)
Quiero pasar la devolución de llamada de mi código de python a c ++
Quiero que mi código se vea algo como esto: En C ++:
typedef void (*MyCallback_t) (CallbackInfo);
class MyClass
{...
void setcallback(MyCallback_t cb);
...
}
Y para usarlo en python:
import mylib
def myCallback(mylib_CallbackInfo):
...
t = mylib.MyClass()
t.setcallback(myCallback)
Vi algunos temas cerca de mi problema pero no pude resolverlo
Por ejemplo, aquí: procesamiento en tiempo real y devoluciones de llamadas con Python y C ++, hay consejos para usar boost :: python y advertencias sobre GLI, pero no hay ejemplos. Y aquí
Cómo llamar a una función de python desde un hilo de idioma extranjero (C ++) no hay una descripción completa con la parte del código de python y con la parte "BOOST_PYTHON_MODULE"
También encontré el enlace para usar py_boost_function.hpp, por ejemplo, en Boost python howto, pero no se compiló y, de hecho, no pude entender cómo usarlo.
Ok, todavía estoy tratando de resolver esto también, pero esto es lo que me está funcionando hasta ahora:
#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);
La función python se invoca desde C ++ y se ejecuta como se espera.