我可以使用ctypes为可变参数Python函数创建原型,以便DLL可以将此函数作为回调调用吗?

时间:2012-12-13 19:58:38

标签: python callback ctypes variadic

这是场景:我使用ctypes将C DLL加载到Python程序中。我想注册一个回调,以便DLL中的代码可以用Python调用函数。

这一切都很棒,直到我想让函数成为可变参数。例如,假设我想在Python中实现“printf”(为了参数,我也会让它返回一个整数):

def printf(format, *args):
    (...)
    return 0

我正在使用ctypes中的CFUNCTYPE工厂创建回调函数指针:

callback_type = CFUNCTYPE(c_int, c_wchar_p)

当然,由于我只指定了一个输入参数(格式字符串作为Unicode字符数组),回调有效,但*args为空。

那么,有没有什么方法可以使用ctypes,或者我是否需要重写我的C代码以不需要可变参数回调函数?

1 个答案:

答案 0 :(得分:2)

不,底层的libffi不支持它。您确实需要编写自定义C代码。

(Fwiw,CFFI是一种ctypes替代方案。同样基于libffi,它也受到同样的限制---但至少它可以很容易地编写自定义的C代码来进行接口。)