Search code examples
c++pythoncallbackboost-python

pass callback from python to c++ using boost::python


I want to pass callback from my python code to c++

I want my code look something like this: In C++ :

typedef void (*MyCallback_t) (CallbackInfo);

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

And to use it in python :

import mylib

def myCallback(mylib_CallbackInfo):
...

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

I saw some topics near my problem but couldn't solve it

For example here : Realtime processing and callbacks with Python and C++ there is advice to use boost::python and warning about GLI but no examples. And here

How to call a python function from a foreign language thread (C++) there is no full description with python code part and with "BOOST_PYTHON_MODULE" part

I also found link to use py_boost_function.hpp for example in Boost python howto but it didn't compile and actualy I couldn't understand how to use it.


Solution

  • Ok, I'm still trying to figure this out too, but here's whats working for me so far:

    #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);
    

    The python function is invoked from C++, and executes as expected.