python - 将 mmap 指针作为 mmap 对象从 C 传递给 python

标签 python c pointers mmap word-wrap

我正在尝试将 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,但它们似乎没有达到我想要的效果?

最佳答案

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

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

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

最后,您始终可以创建一个新类,该类公开您想要的映射周围的任何接口(interface),并根据需要使其尽可能类似于 mmap

关于python - 将 mmap 指针作为 mmap 对象从 C 传递给 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14761350/

相关文章:

python - 连接 pandas Dataframe 中的行

python - TypeError : list indices must be integers, not str - Odoo v8 到 Odoo v10 社区

c - 返回指针时出现段错误

c++ - 什么时候必须编译 C/C++?

c - 如何防止 scanf() 自动将剩余数字插入下一个数组?

c - 问题取消引用类型 void**

c - mmap ed 区域是 "single object"吗?我可以比较其中的指针吗?

c++ - 模数是如何工作的,为什么它在 Python 中与大多数语言不同?

python - pip 从缩短的 url 安装

c - 如何从文件中读取指向整数指针的指针?