当前位置: 首页 > 知识库问答 >
问题:

如何使用Python脚本将指针变量从一个cython模块传输到另一个模块

郗学
2023-03-14

假设我们有一个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 ) # ???

使用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使用什么?

共有1个答案

庄欣然
2023-03-14

解决方案是将指针变量包装到一个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的强制转换。在类B中,我们必须将变量转换回一个要浮点的指针。

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中,该信息就会丢失。

 类似资料:
  • 问题内容: 假设我有一个名为的软件包,其中包含: 和: 然后我执行以下脚本: 这是我的期望: 这是我得到的: 谁能解释我的误解? 问题答案: 您正在使用。在导入模块的全局范围(或​​发生import语句的任何范围)中成为符号。 当您为指定新值时,您也只是在更改哪些值点,而不是实际值。尝试直接使用in导入,并通过设置在那里进行实验。这样,您实际上将在此上下文中修改哪个是“实际”值。 它有点令人费解,

  • 问题内容: 我有两个 newAccessLevels.java ,它有两个按钮“ Level 1”,“ Level 2”和 newAccessPanel.java。 我需要获取用户选择“ 1或2”的级别,以便可以在标题中显示它。 accessPanel.java, 例如访问级别1,访问级别2。如何完成此操作。下面是示例代码,因此,如果单击级别1,则将打开标题为* ACCESS LEVEL 1 的n

  • 问题内容: 我正在尝试将cython模块data.pyx导入另一个cython模块user.pyx。一切编译正常,但是当我尝试在python模块中调用user.pyx时,出现错误“ ImportError:没有名为data的模块”。 一切都在同一目录中。 我的setup.py 运行以下test.py将引发错误。 我得到的例外是 如何进行导入?谢谢你的帮助。 问题答案: 我可能缺少有关Cython的

  • 问题内容: 在我的angularJS应用程序中,我有两个模块:模块A和模块B。 如何在模块B中调用该函数? 问题答案: 您需要在 模块A中 定义一个工厂: 然后使用 模块B中* 的工厂: *

  • 我的视图文件夹中有两个EJ,我创建了非常简单的EJ,看看是否可以将变量从一个EJ发送到另一个EJ。 a、 vews文件中的ejs b.ejs有 在我的节点js这是什么我做const表达式=要求('Express'); const body Parser=要求('body-parser'); 我想邮报必须在这里做点什么...

  • 问题内容: 将尽可能多的字节从ByteBuffer 放入另一个ByteBuffer 的最有效方法是什么(以及知道传输了多少字节)?我正在尝试,但似乎要抛出BufferOverflowException,当我需要它们时,我现在无法从Sun获取Javadocs(网络问题)。> :( argh。 编辑:darnit,如果bbuf_src是ReadOnly缓冲区,则@Richard 的方法(使用来自bac