如何使用 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 ) # ???

使用AB的相应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

这不仅适用于浮动指针,还适用于任何类型的指针。必须确保两个模块(AB)处理相同类型的指针,因为一旦指针被包裹在 uintptr_t.[=18= 中,该信息就会丢失]