是否可以从C dll
函数调用Python函数?
我们考虑这个C函数:
void foo( void (*functionPtr)(int,int) , int a, int b);
在Python上,我想调用foo
并将回调设置为Python函数:
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) )
不幸的是,ctypes
文档对这个主题非常清楚,上面的代码不起作用。
答案 0 :(得分:8)
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
如果您需要stdcall
来电约定use WINFUNCTYPE
instead。
注意:如果foo
可能存储稍后要调用的回调,那么请确保Python回调是活动的(如果使用装饰器在全局级别定义它就足够了,如示例所示 - 除非你试图明确地删除它们,否则模块在Python中基本上是不朽的。)
答案 1 :(得分:2)
使用CFUNCTYPE
创建回调类型:
c_callback = CFUNCTYPE(None, c_int, c_int)(callback)
dll.foo(c_callback, a, b)