如何在Python 2.5中将内存块作为文件对象访问?
我想在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语言中一样的后果:在大多数情况下,会出现段错误。