Как получить доступ к блоку памяти в виде файлового объекта в Python 2.5? - PullRequest
2 голосов
/ 18 ноября 2011

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 18 ноября 2011

Вы должны использовать там ctypes. Начиная с Python 2.5 ctypes, где уже есть стандартная библиотека, ситуация для вас "win".

С помощью ctypes вы можете создать объект python, представляющий пуанты более высокого уровня, выполнив это:

import ctypes 
integer_pointer_type = ctypes.POINTER(ctypes.c_int)
my_pointer = integer_pointer_type.from_address(your_address)

Затем вы можете адресовать содержимое памяти как индексированный объект Python, например распечатать 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 голос
/ 18 ноября 2011

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

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

...