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

use*_*009 5 c++ python cython

如何使用 cython 将 python 对象暴露给 C++?我了解如何为函数完成它,但不确定这对于一个类是否可行。

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

Dav*_*idW 7

答案是使用“公共扩展类型”

一个简单的例子是:

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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

__PYX_EXTERN_C DL_IMPORT(PyTypeObject) TheNameTheTypeWillHaveInC;
Run Code Online (Sandbox Code Playgroud)

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

void modifyMyClass(TheNameThisWillHaveInC* obj) {
   obj->a = 5; // etc
}
Run Code Online (Sandbox Code Playgroud)

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