如何使用 cython 将 python 类公开给 c++
Posted
技术标签:
【中文标题】如何使用 cython 将 python 类公开给 c++【英文标题】:How to expose a python class to c++ using cython 【发布时间】:2016-02-16 14:09:56 【问题描述】:如何使用 cython 将 python 对象公开给 C++?我了解如何为函数完成它,但不确定这是否可以用于一个类。
基本上,我有一个用 cython 编写的数据结构,必须由 C++ 填充。填充后,c++ 代码将调用 cython 方法并传递该对象。该方法中的 cython 代码应该能够访问对象的数据。
【问题讨论】:
docs.cython.org/src/userguide/wrapping_CPlusPlus.html @SimonKraemer 谢谢。它对我有用。我仍然想知道我们是否真的必须手动编写这些包装代码(python 类的 pyx 文件和 pxd 文件)。不能生成吗?在我的要求中,我必须向 python 公开的内容非常广泛,涉及自定义类、std 容器等,并且手动编写所有这些包装器代码似乎无法扩展。 【参考方案1】:答案是使用"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
中指定语言以避免名称混淆问题。
【讨论】:
非常有用。谢谢,@DavidW!我确实收到了来自 gcc(和 clang)的有趣警告,例如expected 'struct MyNode *' but argument is of type 'struct MyNode *'
警告。这让我走上了一条漫长而丑陋的道路,但决定它有效并继续前进。给路过的人留个便条。以上是关于如何使用 cython 将 python 类公开给 c++的主要内容,如果未能解决你的问题,请参考以下文章
使用 Cython 时如何将一个 C++ 类(引用)传递给另一个?