gpt4 book ai didi

python - 在 cython 中将 C++ 对象转换为 python 对象?

转载 作者:太空宇宙 更新时间:2023-11-03 15:08:06 24 4
gpt4 key购买 nike

我的第一个 cython 程序遇到了困难,所以如果我有一个愚蠢的问题,请不要阻止我。

这是我的例子:

c_foo.h:

// c_foo.h
class foo:
{
public:
....

std::unique_ptr<2DVector> get_cFoo_unique_ptr(); // Vec2D<T> is a vector of vectors of T
// std::vector<std::vector<T>>

private:
std::unique_ptr<Vec2D> cFoo_unique_ptr; // Vec2D<T> is a vector of vectors of T
}

foo.pyx: # foo.pyx 导入赛通 ... # 其他导入 从 cython.operator cimport unique_ptr as cpp_unique_ptr

cdef extern from c_foo.h:
cdef cppclass c_foo:
...

cpp_unique_ptr get_cFoo_unique_ptr()


cdef class py_foo:
cdef c_foo* cFoo

...

def get_Vec2D(self):
return self.cFoo.get_cFoo_unique_ptr().get()

所以,我在这里尝试做的是从 C++ unique_ptr 获取数据并在 python 中返回它们。cython 对此有所提示。

def get_Vec2D(self):
return self.cFoo.get_cFoo_unique_ptr().get()
----------------------------------------------------------
foo.pyx:xx:xx: Cannot convert 'T *' to Python object

另一种尝试是我尝试其他方式来声明向量的 cython unique_ptr:

# foo.pyx
import cython
... # other import
from cython.memory cimport unique_ptr as cpp_unique_ptr
from cython.vector cimport vector as cpp_vector

cdef extern from c_foo.h:
cdef cppclass c_foo:
...

cpp_unique_ptr[cpp_vector[cpp_vector[T]]] get_cFoo_unique_ptr()


cdef class py_foo:
cdef c_foo* cFoo

...

def get_Vec2D(self):
return self.cFoo.get_cFoo_unique_ptr().get()

仍然是同样的错误:

Cannot convert 'vector[vector[T]] *' to Python object

所以,我的问题是如何在 cython 中访问 C++ unique_ptr 的数据?对于通过 cython 在 C++ 和 python 之间传递数据,我应该知道什么好的做法吗?

谢谢

最佳答案

这种事情让我困惑了很长时间。我只在 C 环境中使用 Cython,而不是 C++,所以我不知道您的情况中可能存在其他选项。但我会解释我是如何做到这一点的,希望对您有所帮助。

您必须在 Cython 函数末尾创建 Python 对象,因为这些是唯一有效的返回值。这意味着,除其他外,您不能返回指针或 C 数组。例如,假设我有一个计算 double 组的 Cython 函数 f:

def f():
cdef double aa[1000]
cdef int i
# ....
# some calculation that populates aa
# ....
# Now I can't just return aa because aa isn't a Python object.
# I have to convert it to a Python list:
a = []
for i in range(1000):
a.append(aa[i]) # Cython knows how convert one C float to one Python float
return a

关于python - 在 cython 中将 C++ 对象转换为 python 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44468396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com