Как получить доступ к блоку памяти в качестве файлового объекта в Python 2.5?

Я хотел бы получить файл-объект для блока памяти в Python 2.5 под Windows (по некоторым причинам я не могу использовать более новые версии для этих задач.)

Так как в качестве ввода у меня есть pointer и size и предположим, что мне нужен только доступ только для чтения.

В случае, если вы задаетесь вопросом, я получил их с помощью ctypes, и мне нужно сделать их доступными для функции, ожидающей удаления файла (только для чтения).

Я рассмотрел использование cStringIO но для создания такого объекта мне нужен string объект.

Вы должны использовать там 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]

Это не даст вам «файл как интерфейс» – хотя было бы тривиально обернуть класс с помощью методов «читать» и «искать» вокруг такого объекта:

 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: в большинстве случаев ошибка сегментации.

из документации ctypes , похоже, вы можете получить строку из адреса в памяти, используя ctypes.string_at() .

проблема в том, что строка не изменена, это означает, что вы не сможете изменить полученную строку из python. чтобы иметь изменяемый буфер в python, вам нужно вызвать ctypes.create_string_buffer() из python.