Is it possible to call a Python function from a C dll function?
We consider this C function:
void foo( void (*functionPtr)(int,int) , int a, int b);
On Python, I would like to call foo and set the callback to a Python function:
def callback(a, b):
print("foo has finished its job (%d, %d)" % (a.value,b.value))
dll.foo( callback, c_int(a), c_int(b) )
Unfortunately, the ctypes documentation is pretty light on this topic and the above code does not work.
In the Parallel Python Module, the submit function is known as the callback function. The callback function acts as an argument for any other function. The other function in which the callback function is an argument calls the callback function in its function definition.
A callback function is a function passed into another function as an argument, which is then invoked inside the outer function to complete some kind of routine or action.
ctypes is a python built-in library that invokes exported functions from native compiled libraries. Note: Since this library handles compiled code, it is relatively OS dependent.
import ctypes as c
@c.CFUNCTYPE(None, c.c_int, c.c_int)
def callback(a, b):
print("foo has finished its job (%d, %d)" % (a.value, b.value))
dll.foo(callback, a, b) # assuming a,b are ints
If you need stdcall calling conventions, use WINFUNCTYPE instead.
Note: if foo may store the callback to be called at a later time then make sure that Python callback is alive (it is enough if it is defined at the global level using the decorator as shown in the example -- modules are essentially immortal in Python unless you try to remove them explicitly).
Use CFUNCTYPE to create a callback type:
c_callback = CFUNCTYPE(None, c_int, c_int)(callback)
dll.foo(c_callback, a, b)
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