将结构*从一个Cython类传递到另一个

时间:2019-03-07 23:41:30

标签: python cython

我正在尝试将结构指针从一个Cython类传递给另一个。这是一些示例代码:

cdef struct MyStruct:
    int a
    int b

cdef class MyClass:
    cdef MyStruct* s
    def __init__(self):
        self.s = <MyStruct*> malloc(sizeof(MyStruct))
        self.s.a = 1
        self.s.b = 2

    cdef MyStruct* get_my_struct(self):
        return self.s

cdef class PrinterClass:
    cdef object m
    def __init__(self):
        self.m = MyClass()

    cpdef print_struct(self):
        cdef MyStruct* my_struct
        my_struct = self.m.get_my_struct()
        print(my_struct.a)

当我尝试编译此类时,我在my_struct = self.m.get_my_struct()行周围遇到了这两个错误:

  

无法将Python对象转换为'MyStruct *

  

存储临时Python参考的不安全C派生

为什么Cython在这里尝试进行转换?它不能按原样传递指针吗?

1 个答案:

答案 0 :(得分:1)

PrinterClass中,将cdef object m替换为cdef MyClass m或将self.m强制转换为MyClassmy_struct = (<MyClass>self.m).get_my_struct()。 (此外,应将__dealloc__添加到MyClass中)。

我想区别在于object是一个python对象(本质上是dict),而cdef class是另一种类(本质上是struct ),请参见Extension types (aka. cdef classes)

期待其他专家的进一步启示:)