如何在Python2.5中作为文件对象访问内存块?
我想在Windows下为Python 2.5中的内存块获取一个文件对象(由于某些原因,我无法使用较新版本来执行此任务) 作为输入,我有一个如何在Python2.5中作为文件对象访问内存块?,python,ctypes,python-2.5,Python,Ctypes,Python 2.5,我想在Windows下为Python 2.5中的内存块获取一个文件对象(由于某些原因,我无法使用较新版本来执行此任务) 作为输入,我有一个指针和一个大小,假设我只需要只读访问 如果您想知道,我是通过使用ctypes获得这些文件的,我需要使它们对需要filehandler(只读)的函数可用 我曾考虑过使用cStringIO,但为了创建这样一个对象,我需要一个string对象。从ctypes文档中,似乎可以使用从内存中的地址获取字符串 问题是字符串是不可变的,这意味着您将无法修改python生成的字
指针和一个大小,假设我只需要只读访问
如果您想知道,我是通过使用ctypes获得这些文件的,我需要使它们对需要filehandler(只读)的函数可用
我曾考虑过使用cStringIO
,但为了创建这样一个对象,我需要一个string
对象。从ctypes
文档中,似乎可以使用从内存中的地址获取字符串
问题是字符串是不可变的,这意味着您将无法修改python生成的字符串。要在python中拥有可变缓冲区,您需要从python中调用。您应该在其中使用ctypes。对于标准库中已经存在的Python2.5cTypes来说,这是一个“双赢”的局面
使用ctypes,您可以构造一个python对象来表示更高级别的点,具体操作如下:
import ctypes
integer_pointer_type = ctypes.POINTER(ctypes.c_int)
my_pointer = integer_pointer_type.from_address(your_address)
然后可以将内存内容作为Python索引对象进行寻址,如
打印我的_指针[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中完全相同的效果:在大多数情况下,是分段错误。您有一个指针??指针在python中的含义是什么?与C中的含义相同——数据所在的进程内存地址。如何获取所述数据是一个完全不同的问题。根据要求添加了详细信息:)请注意python fileobject是一个仅限python的构造:它并不总是有与之关联的系统文件句柄。我也没有对其进行测试,但我认为给出大于self.size
的读取大小是不好的。最好检查一下。并且可以将self.cursor
内容直接放在return res
之前,形式为self.cursor+=len(res)
——这涵盖了所有情况。