如何在Python 2.5中将内存块作为文件对象访问?

2 投票
2 回答
587 浏览
提问于 2025-04-17 06:34

我想在Windows下的Python 2.5中获取一个内存块的文件对象。(因为某些原因,我不能使用更新版本来完成这个任务。)

我手头有一个指针和一个大小,假设我只需要读取权限。

如果你想知道,我是通过使用ctypes获得这些的,我需要把它们提供给一个期望文件处理器(只读)的函数。

我考虑过使用cStringIO,但要创建这样的对象,我需要一个字符串对象。

2 个回答

1

根据ctypes的文档,你可以通过一个内存地址获取一个字符串,这个操作可以使用函数ctypes.string_at()来完成。

不过,字符串是不可变的,这意味着你不能直接修改从Python得到的字符串。如果你想在Python中有一个可以修改的字符串缓冲区,你需要使用ctypes.create_string_buffer()函数

6

你可以在这里使用ctypes。从Python 2.5开始,ctypes就已经是标准库的一部分了,所以这对你来说是个“赢”的选择。

通过ctypes,你可以创建一个Python对象,来表示一个更高级的指针,方法是这样做:

import ctypes 
integer_pointer_type = ctypes.POINTER(ctypes.c_int)
my_pointer = integer_pointer_type.from_address(your_address)

然后你可以像访问Python列表那样,使用索引来访问内存中的内容,比如说:
print my_pointer[0]

这样做不会给你一个“文件式的接口”——不过,包裹一个带有“read”和“seek”方法的类在这样的对象周围是很简单的:

class MyMemoryFile(object):
    def __init__(self, pointer, size=None):
         integer_pointer_type = ctypes.POINTER(ctypes.c_uchar)
         self.pointer = integer_pointer_type.from_address(your_address)
         self.cursor = 0
         self.size = size

    def seek(self, position, whence=0):
         if whence == 0:
              self.cursor = position
         raise NotImplementedError
    def read(size=None):
         if size is None:
             res =  str(self.pointer[cursor:self.size])
             self.cursor = self.size
         else:
             res = str(self.pointer[self.cursor:self.cursor + size]
             self.cursor += size
         return res

(这个代码没有测试过——如果它不工作,请联系我——可以修复的)

请注意,尝试读取超出你数据结构分配内存的部分,会产生和在C语言中一样的后果:在大多数情况下,会出现段错误。

撰写回答