【问题标题】:Get the value of a Cython pointer获取 Cython 指针的值
【发布时间】:2014-07-15 17:01:43
【问题描述】:

我正在编写一个构造 malloc 的 unsigned char * 数组的函数,然后重新调整指针。在纯 Cython 或 C 中,这很容易。您所要做的就是在函数上设置一个返回类型,并返回指向数组的指针。完毕。但是,我已经到了需要将指向在 Cython 中创建的数组的指针返回给 Python 的地步。我知道指针只是内存地址。有什么方法可以将 Cython 指针作为 python 对象返回给 Python(例如 int 或 hex,因为内存地址本质上是一个数字),这样我就可以基本上在 python 中管理指针了?

我试图像这样返回指针的值:

cdef unsigned char array[8]

def return_pointer():
    return &array

这当然行不通,因为转换无法完成。 Cython 向 Cannot convert 'unsigned char (*)[8]' to Python object 投诉。有什么建议吗?

编辑:

我不需要访问Python中指针所引用的内存地址中的值,只需要传递指针。然后我打算使用 Python 对象指针,并以它作为参数调用 c 函数。

【问题讨论】:

  • 有几种选择,其中任何一种(如果有)是正确的,很大程度上取决于您要达到的目标。
  • 那么我的函数是否提供了一个可以缩小范围的具体示例?
  • 不,替代品都是从指针开始的。如中,您的函数同样可以轻松地转换为其中的任何一个。顺便说一句,您的示例函数是错误的。它返回一个指向本地的指针,该指针在返回后被释放,它创建一个指向整个数组的指针(类型unsigned char (*)[N])而不是强制它指向一个指向第一个元素的指针(类型unsigned char *),这是迄今为止更习惯和更有用,尽管它在技术上最终是相同的地址。
  • 好的,我编辑了本地数组,但问题是,当我创建一个指向第一个元素的 unsigned char 指针并将其返回时,Python 将其视为字符串并打印随机记忆。我错过了什么吗?
  • 是的,这是另一种选择,显然这不是您想要的。你也可以把指针变成int,你可以构造ctypes指针,你甚至可以创建cffi指针等等,除非你解释你想要做什么,否则没有人可以帮助你决定哪个是对的。

标签: python c pointers cython


【解决方案1】:

您可以将指针强制转换为适当的 C 类型,然后 Cython 应将其转换为 Python 整数。正确的 C 类型是 uintptr_t 来自 <stddef.h>,在 Cython 中可以通过 from libc.stdint cimport uintptr_t 获得。演员表当然写成<uintptr_t>array_or_pointer

【讨论】:

  • 完美,这也允许我将 uintptr_t 类型从 python 转换为无符号字符数组。这正是我所需要的,谢谢!
  • 很好的答案,只是关于导入的一个小修正。它应该是 cimport 而不是 import 才能工作。
  • @sirfz 谢谢,已修复。
  • 我如何逆向并将整数转换回指针?
  • @DavoudTaghawi-Nejad 您需要将整数转换回适当的指针类型。在处理字符的 OP 问题中,这意味着要做<char *>my_uintptrs_name
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
相关资源
最近更新 更多