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

我是否可以使用ctypes为可变Python函数创建一个原型,以便DLL可以将此函数作为回调调用?,python,callback,ctypes,variadic,Python,Callback,Ctypes,Variadic,下面是一个场景:我使用ctypes将C DLL加载到Python程序中。我想注册一个回调,以便DLL中的代码可以调用Python中的函数 这是所有伟大的,直到我想有一个函数是可变的。例如,假设我想在Python中实现“printf”(为了参数起见,我还将让它返回一个整数): 我正在使用ctypes中的CFUNCTYPE工厂创建回调函数指针: callback_type = CFUNCTYPE(c_int, c_wchar_p) 当然,因为我只指定了一个输入参数(格式字符串为Unicode字符数

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

这是所有伟大的,直到我想有一个函数是可变的。例如,假设我想在Python中实现“printf”(为了参数起见,我还将让它返回一个整数):

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

callback_type = CFUNCTYPE(c_int, c_wchar_p)
当然,因为我只指定了一个输入参数(格式字符串为Unicode字符数组),所以回调可以工作,但是
*args
是空的


那么,是否有任何方法可以使ctypes工作,或者我需要重写我的C代码以不需要可变回调函数?

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


(Fwiw是ctypes的替代品。同样基于libffi,它也受到同样的限制——但至少它使编写自定义的C代码片段来进行接口变得容易。)

编辑了CFFI的文档,以获得一个用C编写的自定义回调示例,其本身调用Python。
callback_type = CFUNCTYPE(c_int, c_wchar_p)