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