首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ctype结构传递给cython

将ctype结构传递给cython
EN

Stack Overflow用户
提问于 2017-05-24 12:11:04
回答 1查看 1.3K关注 0票数 1

我有一个C库(称为clib和标头clib.h),通过Ctypes调用。函数get_struct返回指向结构Foo的指针,该结构是在clib.h中前向声明的,我可以将该指针作为指针用于其他函数调用(如use_struct(Foo* foo))。我想使用这个指针在Cython中调用相同的函数代码。

因为我不知道结构的内容,所以我不能在cython中创建一个重复的结构并复制来自ctype的值。因此,我想创建一个指向相同内存空间的cython指针,以便调用绑定相同API的C代码。

代码大致是这样做的。

在clib.h:

代码语言:javascript
复制
typedef struct Foo Foo;
Foo * get_struct();
void use_struct(Foo *)

在python端,使用ctype:

代码语言:javascript
复制
# load clib DLL
clib = ctypes.CDLL('clib.so')

# empty Ctypes declaration
class Foo_ct(ctypes.Structure):
    pass

# get and use the struct
clib.get_struct.restype = ctypes.POINTER(Foo_ct)
foo_ct = clib.get_struct()
clib.use_struct(foo_ct)

# call cython code
bar(foo_ct)

在Cython方面,在cylib.pyx中:

代码语言:javascript
复制
cdef extern from "clib.h":
    cdef struct Foo:
        pass

    void use_struct(Foo *)


cpdef bar(foo_ct):

    cdef Foo* foo_cy
    foo_cy = <Foo*>&foo_ct  # or something equivalent
    cy_use_struct(foo_cy)

在Cython方面,在cylibc.cpp中:

代码语言:javascript
复制
#import "clib.h"

void cy_use_struct(Foo * foo)
{
    use_struct(foo);
}

这不会生成并返回行Cannot take address of Python variableassigning to 'PyObject *' (aka '_object *') from incompatible type 'void'上的错误foo_cy = <Foo*>&foo_ct

有什么好办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-25 10:46:16

基于@oz1和@DavidW的注释,以下工作:

代码语言:javascript
复制
from libc.stdint cimport uintptr_t
cdef uintptr_t adr = <uintptr_t>ctypes.addressof(foo_ct.contents)
cy_use_struct(<Foo*>adr)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44158089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档