使用ctypes进行回调(如何从C调用python函数)

时间:2015-11-02 18:39:35

标签: python ctypes

是否可以从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文档对这个主题非常清楚,上面的代码不起作用。

2 个答案:

答案 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)