如何使用 Python 脚本将指针变量从一个 cython 模块传输到另一个模块
How can I transfer a pointer variable from one cython module to another using a Python script
假设我们有一个 cython class A
带有指向 float
的指针,如
# A.pyx
cdef class A:
cdef float * ptr
我们在另一个模块中也有一个 cython class 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_ptr()
以及我们将在 B
中为 get_from
使用什么?
解决方案是将指针变量包装到一个Python对象中。模块 libc.stdint 提供了一个名为 uintptr_t
的类型,它是一个足够大的整数来存储任何类型的指针。有了这个,解决方案可能如下所示。
from libc.stdint cimport uintptr_t
cdef class A:
cdef float * ptr
def get_ptr(self):
return <uintptr_t>self.ptr
尖括号 <uintptr_t>
中的表达式对应于对 uintptr_t
的转换。在 class B 中,我们必须将变量转换回指向 float 的指针。
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
这不仅适用于浮动指针,还适用于任何类型的指针。必须确保两个模块(A
和 B
)处理相同类型的指针,因为一旦指针被包裹在 uintptr_t
.[=18= 中,该信息就会丢失]
假设我们有一个 cython class A
带有指向 float
的指针,如
# A.pyx
cdef class A:
cdef float * ptr
我们在另一个模块中也有一个 cython class 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_ptr()
以及我们将在 B
中为 get_from
使用什么?
解决方案是将指针变量包装到一个Python对象中。模块 libc.stdint 提供了一个名为 uintptr_t
的类型,它是一个足够大的整数来存储任何类型的指针。有了这个,解决方案可能如下所示。
from libc.stdint cimport uintptr_t
cdef class A:
cdef float * ptr
def get_ptr(self):
return <uintptr_t>self.ptr
尖括号 <uintptr_t>
中的表达式对应于对 uintptr_t
的转换。在 class B 中,我们必须将变量转换回指向 float 的指针。
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
这不仅适用于浮动指针,还适用于任何类型的指针。必须确保两个模块(A
和 B
)处理相同类型的指针,因为一旦指针被包裹在 uintptr_t
.[=18= 中,该信息就会丢失]