如何使用Python脚本将指针变量从一个cython模块传输到另一个cython模块
假设我们有一个cython类如何使用Python脚本将指针变量从一个cython模块传输到另一个cython模块,python,cython,Python,Cython,假设我们有一个cython类a,其指针指向float,如 # A.pyx cdef class A: cdef float * ptr 我们在另一个模块中还有一个cython类B,需要访问ptr下的数据: # B.pyx cdef class B: cdef float * f_ptr cpdef submit(self, ptr_var): self.f_ptr= get_from( ptr_var ) # ??? 使用A和B的相应Python代
a
,其指针指向float
,如
# A.pyx
cdef class A:
cdef float * ptr
我们在另一个模块中还有一个cython类B
,需要访问ptr
下的数据:
# B.pyx
cdef class B:
cdef float * f_ptr
cpdef submit(self, ptr_var):
self.f_ptr= get_from( ptr_var ) # ???
使用A
和B
的相应Python代码可能类似于
from A import A
from B import B
a = A()
b = B()
ptr = a.get_ptr()
b.submit(ptr)
我们如何定义
get\u ptr()
以及在B
中使用什么来从get\u?解决方案是将指针变量包装到Python对象中。模块libc.stdint提供一个名为uintptr\u t
的类型,该类型是一个足够大的整数,可以存储任何类型的指针。这样,解决方案可能如下所示
from libc.stdint cimport uintptr_t
cdef class A:
cdef float * ptr
def get_ptr(self):
return <uintptr_t>self.ptr
这适用于任何类型的指针,而不仅仅是浮动指针。必须确保两个模块(A
和B
)处理相同类型的指针,因为一旦指针包装在uintpu t
中,该信息就会丢失
from libc.stdint cimport uintptr_t
cdef class B:
cdef float * f_ptr
cpdef submit(self, uintptr_t ptr_var):
self.f_ptr= <float *>ptr_var