首页 > 解决方案 > 将 struct* 从一个 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 试图在这里进行转换?它不能按原样传递指针吗?

标签: pythoncython

解决方案


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

我想区别在于它object是一个 python 对象(本质上是dict),cdef class而是另一种类(本质上是struct),请参阅扩展类型(又名 cdef 类)

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


推荐阅读