这是场景:我使用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代码以不需要可变参数回调函数?
答案 0 :(得分:2)
不,底层的libffi不支持它。您确实需要编写自定义C代码。
(Fwiw,CFFI是一种ctypes替代方案。同样基于libffi,它也受到同样的限制---但至少它可以很容易地编写自定义的C代码来进行接口。)