I have the following question. We have to pass callback functions to the C code. If the function is a Cython function in the same module, the situation is quite simple
In Cython:
def callme(int x):
    c_callme(x, <int (*)(int)>&callbackme) 
cdef int callbackme(int x):
    print <int> x
    return <int>x
In C:
int c_callme(int x, int (*f)(int))
{
    printf("---%d\n",x);
    printf("--%d\n",f(x));
    return x;
}
The question is as follows: we want to generalize this code in the most Pythonic way so that it can accept also python functions as callback arguments (of course, some additional layer is needed), and also C/Cython functions from another module. I suppose, for C/Cython functions from a separate module one has to get the address of these functions (convert to long int?) and for Python function a certain wrapper is needed
In this example, extracted from a Python wrapper to the Cubature integration C library, a Python function is passed to a C function that has the prototype given by cfunction. You can create a function with the same prototype, called cfunction_cb (callback), and returning the same type, int in this example):
cdef object f
ctypedef int (*cfunction) (double a, double b, double c, void *args)
cdef int cfunction_cb(double a, double b, double c, void *args):
    global f
    result_from_function = (<object>f)(a, b, c, *<tuple>args)
    for k in range(fdim):
        fval[k] = fval_buffer[k]
    return 0
When calling the C function, you can cast your callback wrapper using the C prototype:
def main(pythonf, double a, double b, double c, args): 
    global f
    f = pythonf
    c_function( <cfunction> cfunction_cb,
                double a,
                double b,
                double c,
                <void *> args )
In this example it is also shown how to pass arguments to your Python function, through C.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With