【问题标题】:passing a mmap pointer from C to python as a mmap object将 mmap 指针从 C 传递给 python 作为 mmap 对象
【发布时间】:2013-02-07 21:30:27
【问题描述】:

我正在尝试将 C 库(beaglebone PRU 驱动程序 prussdrv.c)与 Python 连接。我要访问的特定函数返回一个 mmap 指针,如下所示:

int __prussdrv_memmap_init(void) {
      prussdrv.pru0_dataram_base = mmap(0, prussdrv.pruss_map_size, PROT_READ | PROT_WRITE,
         MAP_SHARED, prussdrv.mmap_fd, PRUSS_UIO_MAP_OFFSET_PRUSS);
      ...

int prussdrv_map_prumem(unsigned int pru_ram_id, void **address) {    
     switch (pru_ram_id) {
     case PRUSS0_PRU0_DATARAM:
          *address = prussdrv.pru0_dataram_base;
           break;

prussdrv_map_prumem (DATARAM[PRU_NUM], &pruDataMem);
pruDataMem_byte = (unsigned char*) pruDataMem;

我想封装 pruDataMem 或 pruDataMem_byte 并将其作为 mmap 对象传递给 Python。有没有一种简单的方法可以做到这一点?我查看了 capsule 和 ctypes,但它们似乎没有达到我想要的效果?

【问题讨论】:

  • 它是否必须是一个您可以操作的mmap 对象,或者只是一些类似缓冲区的东西,您可以像使用@ 一样将其视为字符串/列表/迭代器987654323@?

标签: python c pointers mmap word-wrap


【解决方案1】:

我认为没有任何方法可以从这样的本机映射中创建 Python mmap 对象。协议未发布,内部格式也未发布。

当然the source 是可用的。因此,只要您的映射符合new_mmap_object 创建的所有相同标准,您就可以手动构造一个包装信息的mmap_object,并将其传回。 (您实际上无法访问mmap_object 类型,因为它不在任何头文件中。但是如果您创建等效类型,或者只是复制并粘贴代码,您将将它作为PyObject * 传递,只要它的类型字段指向正确的类型,它就会起作用。)

但是,我不确定您是否需要这样做。你真的需要mmap,还是任何你可以当作字符串/列表/迭代器的缓冲区?因为后者要容易得多。为此,您可以只创建一个 old-style buffernew-style buffer 类,或者,如果您只需要 2.7+,请使用具体的 memoryview 类型。从概念上讲,您返回映射内存的视图而不是映射本身似乎是有道理的,但我可以想象一些可能不合适的用例。

最后,您始终可以创建一个新类,该类公开您想要围绕映射的任何接口,并尽可能多(或尽可能少地)像 mmap 一样。

【讨论】:

  • 是的,任何类型的缓冲区(如访问)都可以使用。我已经开始研究根据您还建议的 new_mmap_object 代码手动将 mmap 对象放在一起,但希望使用缓冲区类或 memoryview 会比这更容易。谢谢指点!我会开始调查他们。
  • @cyann:你关心什么 Python 版本?您不想在任何东西中使用旧的具体缓冲区类。如果可以,请使用memoryview。如果您需要 2.6,则必须编写自己的新缓冲区协议类,但这很容易(您可以从 2.7 的memoryview 大量借用)。如果您需要 2.5 或更早版本,则必须实现旧的缓冲区协议——最好的指导是您不必实现协议中的所有内容,只需实现代码所需的部分即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多