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

时间:2011-11-18 10:33:02

标签: python ctypes python-2.5

我想在Windows下的Python 2.5中获取一个内存块的文件对象。(由于某些原因,我无法使用较新的版本来执行此任务。)

作为输入,我确实有pointersize,我们假设我只需要只读访问。

如果你想知道,我通过使用ctypes得到了这些,我需要让它们可用于需要文件处理程序的函数(只读)。

我考虑使用cStringIO但是为了创建这样的对象,我需要一个string对象。

2 个答案:

答案 0 :(得分:6)

你应该在那里使用ctypes。从已经在标准库中的Python 2.5 ctypes开始,对你来说是一个“胜利”的情况。

使用ctypes,你可以构造一个代表更高级别的pointe的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中执行此操作具有完全相同的效果:在大多数情况下,是分段错误。

答案 1 :(得分:1)

来自ctypes文档,您可以使用the ctypes.string_at() function从内存中的地址获取字符串。

问题是字符串不可变,这意味着您将无法从python中修改生成的字符串。要在python中使用可变缓冲区,您需要从python中调用ctypes.create_string_buffer() function