如何使用 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
中指定语言以避免名称混淆问题。
如何使用 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
中指定语言以避免名称混淆问题。