这是场景:我正在使用 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 代码以不需要可变参数回调函数?
最佳答案
不,底层 libffi 不支持它。您确实需要编写自定义 C 代码。
(Fwiw,CFFI 是 ctypes 的替代品。同样基于 libffi,它也有同样的限制 --- 但至少它可以很容易地编写自定义的 C 代码片段来进行接口(interface)。)
关于python - 我可以使用 ctypes 为可变参数 Python 函数创建原型(prototype),以便 DLL 可以将此函数作为回调调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13867473/