Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python脚本将指针变量从一个cython模块传输到另一个cython模块_Python_Cython - Fatal编程技术网

如何使用Python脚本将指针变量从一个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代

假设我们有一个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代码可能类似于

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