如何使用 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++ 类(引用)传递给另一个?

如何在 Cython 中返回新的 C++ 对象?

如何从 cython 公开静态 constexpr

如何使用 Cython 向 Python 公开返回 C++ 对象的函数?

在Cython中使用pyqt类(.pyx文件)

将 cython 函数与 cython 方法传递给 scipy.integrate