我有一个C库(称为clib和标头clib.h),通过Ctypes调用。函数get_struct返回指向结构Foo的指针,该结构是在clib.h中前向声明的,我可以将该指针作为指针用于其他函数调用(如use_struct(Foo* foo))。我想使用这个指针在Cython中调用相同的函数代码。
因为我不知道结构的内容,所以我不能在cython中创建一个重复的结构并复制来自ctype的值。因此,我想创建一个指向相同内存空间的cython指针,以便调用绑定相同API的C代码。
代码大致是这样做的。
在clib.h:
typedef struct Foo Foo;
Foo * get_struct();
void use_struct(Foo *)在python端,使用ctype:
# 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中:
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中:
#import "clib.h"
void cy_use_struct(Foo * foo)
{
use_struct(foo);
}这不会生成并返回行Cannot take address of Python variable或assigning to 'PyObject *' (aka '_object *') from incompatible type 'void'上的错误foo_cy = <Foo*>&foo_ct。
有什么好办法吗?
发布于 2017-05-25 10:46:16
基于@oz1和@DavidW的注释,以下工作:
from libc.stdint cimport uintptr_t
cdef uintptr_t adr = <uintptr_t>ctypes.addressof(foo_ct.contents)
cy_use_struct(<Foo*>adr)https://stackoverflow.com/questions/44158089
复制相似问题