如何使用cython将python类暴露给c ++

时间:2016-02-16 14:09:56

标签: python c++ cython

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

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

1 个答案:

答案 0 :(得分:3)

答案是使用"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中指定语言以避免名称错位问题。