【问题标题】:Python C Extending callback functionsPython C 扩展回调函数
【发布时间】:2014-08-07 13:19:13
【问题描述】:

我正在尝试编写与使用回调函数的 C 库的绑定。

函数接口可能如下所示:

int do_something(int a, void (*callback));

我想在 python 中以相同的方式映射它,以便有人可以编写:

def callback(val):
    print val

do_something(1, callback)

所以 Python 调用 do_something 应该调用 C-Function do_something。并且 Python 函数 callback 应该连接到 C-Functions callback

我应该如何处理这个问题?

提前非常感谢!

【问题讨论】:

  • 您的回调函数指针的C 语法不正确。应该是:void (*callback)(int).
  • 好的,没错。我正在使用 -fpermissive 标志,因为我要链接到的库需要这个...
  • 我不确定它是否应该被声明为 C 函数指针;可能有一些“python函数指针”类型。
  • 好吧,我得到的是一个 PyObject*,它可以被 PyObject_CallObject 调用,但这不是我可以传递给 C-Function do_something 的东西,它需要一个 C 回调:-(

标签: python c binding callback


【解决方案1】:

最简单的方法应该是为每个 C 函数定义一个 Python 包装器并使用它们。由于 C 函数不能直接成为 Python Callable,因此这是一种很好的打包方式。

另一种方法应该是在包含方法 call 的 C 扩展中定义您自己的类。通过这个 C Python 函数,您可以管理您想要的任何内容并执行与 C 函数回调的连接。对象成为通用回调,或子类,或...

如果您想将所有内容都保留在 C 级别,请使用 Python Capsules 来传递 C 函数指针。但是回调是在 C 级别而不是在 Python 级别。

更准确地说,您需要提供回调类型、数量、种类、域等的更多信息。我想不出实现目标的通用方式,但我可以想象各种场景和实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多