python - 将 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 试图在这里进行转换?它不能按原样传递指针吗?
解决方案
在PrinterClass
中,替换cdef object m
为cdef MyClass m
或显式self.m
转换为MyClass
:my_struct = (<MyClass>self.m).get_my_struct()
。(此外,__dealloc__
应将 a 添加到MyClass
)。
我想区别在于它object
是一个 python 对象(本质上是dict
),cdef class
而是另一种类(本质上是struct
),请参阅扩展类型(又名 cdef 类)。
期待其他专家的进一步启示:)
推荐阅读
- jasmine - Jasmine:优先测试文件执行顺序
- wicket - Wicket LambdaModel 和 NumberTextField 无法解析类型
- bootstrap-4 - 在 Symfony 4 中使用带有 Webpack Encore 的引导程序
- visual-studio-code - 使用“react-app”在 Visual Studio Code 中显示创建反应应用程序的 lint 错误
- audio - WAV 到 AIF 转换 - 录制的 AIF 之间的差异
- javascript - 从按钮属性中选择自定义标签
- c# - 'Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection
- ios - 视图和超级视图自动布局的比例高度
- ruby - 将内容列出到 Ruby 变量中
- git - 带有 git 标头的 CLOC diff(代码行数)