3

这是场景:我正在使用 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 char 数组),因此回调有效但*args为空。

那么,有什么方法可以使这项工作与 ctypes 一起工作,还是我需要重写我的 C 代码以不需要可变参数回调函数?

4

1 回答 1

2

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

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

于 2012-12-13T22:22:02.140 回答