【发布时间】:2013-02-24 10:10:09
【问题描述】:
我有一些来自已经分配和初始化的结构的数据。 我可以保证在这些对象的任何生命周期内都不会释放数据。如何将其包装在 Cython 的 Python 对象中?以下确实不工作,但我希望它能解释我的意图:
from libc.stdlib cimport malloc
ctypedef struct Point:
int x
int y
cdef class _MyWrapper:
cdef Point* foo
def __cinit__(self, Point* foo):
self.foo = foo
def create_eternal_MyWrapper(int x, int y):
cdef Point* p
p = <Point*>malloc(sizeof(Point))
p.x = x
p.y = y
return _MyWrapper(p)
在此运行 cython 的输出:
Error compiling Cython file:
------------------------------------------------------------
...
def create_eternal_MyWrapper(int x, int y):
cdef Point* p
p = <Point*>malloc(sizeof(Point))
p.x = x
p.y = y
return _MyWrapper(p)
^
------------------------------------------------------------
examplecy.pyx:17:23: Cannot convert 'Point *' to Python object
【问题讨论】:
-
什么是
MyAllocatedData?一个C结构?cdef class?一种 Python 对象? -
A C 类型。具体来说,一个结构。您想要 C 和 Cython 中的确切结构定义吗?
-
我认为这些细节并不重要。但是如何它“不起作用”?你能提供一个better 的例子吗?
-
@delnan 很公平,对不起。我现在已经举了一个完整的例子。
-
问题不在于您分配数据的方式,而在于您将指针传递给构造函数的方式。传递 NULL 指针会导致同样的错误