使用 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 参数的类型。所以就这样吧:
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++ 类(引用)传递给另一个?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python 包装中使用 unicode 字符串用于带有 cython 的 c++ 类?