使用 Cython 时如何将一个 C++ 类(引用)传递给另一个?

Posted

技术标签:

【中文标题】使用 Cython 时如何将一个 C++ 类(引用)传递给另一个?【英文标题】:How do I pass one C++ class (reference) to another when using Cython? 【发布时间】:2014-01-08 14:55:50 【问题描述】:

我正在尝试使用 Cython 包装一个 C++ 模块,以便我可以在 Python 中使用它。

该模块有多个类,其中一些具有将对象引用作为参数的另一个类的方法。

假设我有名为“foo”和“bar”的 c++ 类,而 cython 将它们包装起来:

cdef extern from "foobar.hpp" namespace "foobar":
    cdef cppclass foo:
        pass
    cdef cppclass bar:
        void kungFoo(foo &f)

现在我想创建一个包装类,以便可以在 Python 中使用它...

cdef class pyFoo:
    cdef foo *thisptr
    def __cinit__(self):
        self.thisptr = new foo()

cdef class pyBar:
    cdef bar *thisptr
    def __cinit__(self):
        self.thisptr = new bar()
    def kungFoo(self, f):
        self.thisptr.kungFoo(f.thisptr)

这会导致“编译 Cython 文件时出错”。和“无法将 Python 对象转换为 'foo'”。

我认为这是因为 cdef cppclass foo 使 foo 成为与 c++ 类关联的“Python 对象”。然而,当我需要将它作为参数传递给另一个 c++ 类时,这种巧妙的转换似乎并没有反过来。

对我来说,这似乎是 cython 的一个基本问题 - 但在谷歌上几个小时后我似乎无法找到任何解决方案。

欢迎任何帮助。

谢谢!

【问题讨论】:

嗯-我尝试了以下方法: self.thisptr.kungFoo(f.thisptr) 并且编译正确。不幸的是,运行结果会导致分段错误。 【参考方案1】:

指定 f 参数的类型。所以就这样吧:

def kungFoo(self, foo &f):
    self.thisptr.kungFoo(f)

或者这个:

def kungFoo(self, pyFoo f):
    self.thisptr.kungFoo(f.thisptr)

【讨论】:

【参考方案2】:

上述答案的第二部分代码应该可以工作,但您可能需要修改它,因为您是通过引用传递的。您可以修改为通过不需要修改的指针传递,也可以导入解引用 cython 模块以将指针指向对象并将对象分配给引用。

Cython and c++ class constructors 的答案中显示了如何使用取消引用的示例

希望这会对您有所帮助。这个问题花了我好几个小时才解决,上面的页面非常有帮助。

【讨论】:

【参考方案3】:

通过引用传递类:

    def kungFoo(self,pyFoo f):
         self.thisptr.kungFoo(f.thisptr[0])

【讨论】:

以上是关于使用 Cython 时如何将一个 C++ 类(引用)传递给另一个?的主要内容,如果未能解决你的问题,请参考以下文章

如何用 Cython 包装 C++ 类?

如何使用 Cython 保持 C++ 类名不被修改?

如何通过cython接口返回对象引用的c ++函数

如何在 python 包装中使用 unicode 字符串用于带有 cython 的 c++ 类?

是否可以通过 Cython 通过引用将值从 Python 传递到 C++?

如何在 Cython 中将 Python 对象转换为 C++ 类型