如何在Python2.5中作为文件对象访问内存块?

如何在Python2.5中作为文件对象访问内存块?,python,ctypes,python-2.5,Python,Ctypes,Python 2.5,我想在Windows下为Python 2.5中的内存块获取一个文件对象(由于某些原因,我无法使用较新版本来执行此任务) 作为输入,我有一个指针和一个大小,假设我只需要只读访问 如果您想知道,我是通过使用ctypes获得这些文件的,我需要使它们对需要filehandler(只读)的函数可用 我曾考虑过使用cStringIO,但为了创建这样一个对象,我需要一个string对象。从ctypes文档中,似乎可以使用从内存中的地址获取字符串 问题是字符串是不可变的,这意味着您将无法修改python生成的字

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

作为输入,我有一个
指针和一个
大小,假设我只需要只读访问

如果您想知道,我是通过使用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)
——这涵盖了所有情况。