如何将C ++函数作为回调传递给Python?

问题描述

我正在使用Python 3 C API与一些Python代码进行交互。

我已经使用PyObject_Call从C ++实例化了Python对象,并且能够使用PyObject_SetAttrString修改了它的某些属性。我想修改属性之一是回调函数,如何从我的C ++函数之一实例化Python对象?

解决方法

您需要做的是创建一个可调用的Python对象,当该对象被调用时,它最终会调用以C(或C ++)实现的函数。

我将实现Python Type Objects docs中指定的新类。它可以实现您可能需要的任何类型的构造函数等,但最重要的是,它应该实现tp_call,它将使该类的实例可调用(就像有一个__call__方法一样)。用Python实现)。

tp_call的实现在C / C ++中,您可以创建此类的实例,这些实例是Python对象,可以传递给任何Python代码。

另请参阅:Defining Extension Types: Tutorial