如何使用cython将python对象暴露给C ++?我理解如何为函数完成它,但不确定这对于一个类是否可行。
基本上,我有一个用cython编写的数据结构,必须用C ++填充。填充后,c ++代码将调用cython方法并传递该对象。该方法中的cython代码应该能够访问对象的数据。
答案 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
中指定语言以避免名称错位问题。