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

标签 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 代码以不需要可变参数回调函数?

最佳答案

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

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

关于python - 我可以使用 ctypes 为可变参数 Python 函数创建原型(prototype),以便 DLL 可以将此函数作为回调调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13867473/

相关文章:

Python BeautifulSoup 返回的网页与我看到的不同

c++ - 如何在 cpp 中编写 python sys.stdout.write

java - Android/Java 中的网络 - 如何在从服务器回调后回调到 API 类?

python - Ctypes Windows错误: exception: access violation writing 0x0000000000000000 while calling a DLL function from another dll file

Python共享读内存

python - 乘以关于列名的不同长度的数据帧

python -/usr/bin/python : No module named pip

javascript - 第二次回调不起作用

java - 如何在Android中定义自定义事件和事件监听器?

python - IPython 支持 ctypes 吗?