如何使用 cython 将 python class 公开给 C++

How to expose a python class to c++ using cython

如何使用 cython 将 python 对象公开给 C++?我了解如何为函数完成此操作,但不确定 class.

是否可行

本质上,我有一个用 cython 编写的数据结构,必须由 C++ 填充。填充后,C++ 代码将调用 cython 方法并传递该对象。该方法中的 cython 代码应该能够访问对象的数据。

答案是使用"public extension types".

一个简单的例子是:

cdef extern from "cpp_file.hpp":
    void modifyMyClass(MyClass)

cdef public class MyClass [object TheNameThisWillHaveInC, type TheNameTheTypeWillHaveInC]:
    cdef int a
    cdef int b
    
def example():
    cdef MyClass a = MyClass()
    modifyMyClass(a)

注意“public class MyClass”。您还需要指定两个名称:一个是用于表示 MyClass 的结构的名称,另一个是类型对象将具有的名称。

运行 Cython 在其上生成一个包含以下内容的头文件(我只复制了有趣的位)。

struct TheNameThisWillHaveInC {
  PyObject_HEAD
  int a;
  int b;
};

__PYX_EXTERN_C DL_IMPORT(PyTypeObject) TheNameTheTypeWillHaveInC;

您只需将该头文件包含在您的 C++ 代码中。我给出的示例函数在 C++ 中将如下所示:

void modifyMyClass(TheNameThisWillHaveInC* obj) {
   obj->a = 5; // etc
}

我认为您使用 C++ 而不是 C 的事实没有太大变化。您唯一需要做的就是 运行 C++ 模式下的 Cython(在 setup.py 中指定语言以避免名称混淆问题。