Доступ к адресу памяти в Python - PullRequest
28 голосов
/ 24 ноября 2011

Мой вопрос: как я могу прочитать содержимое адреса памяти в python? пример: ptr = id (7) Я хочу прочитать содержимое памяти, указанной ptr. Спасибо.

Ответы [ 4 ]

35 голосов
/ 24 ноября 2011

Взгляните на ctypes.string_at .Вот пример.Он сбрасывает необработанную структуру данных целого числа Python 3.Надеюсь, вы делаете это только как упражнение.Нет причин делать это с чистым Python.

from ctypes import string_at
from sys import getsizeof
from binascii import hexlify
a = 0x7fff 
print(hexlify(string_at(id(a), getsizeof(a))))

Вывод

b'02000000d8191e1e01000000ff7f'
8 голосов
/ 24 ноября 2011

В Python вы обычно не используете указатели для доступа к памяти, если вы не взаимодействуете с C-приложением.Если это то, что вам нужно, посмотрите на модуль ctypes для функций доступа.

4 голосов
/ 24 ноября 2011

"Я хочу прочитать содержимое памяти, на которое указывает ptr"

Написать код на языке C. Используйте код из Python.http://docs.python.org/extending/extending.html

1 голос
/ 24 ноября 2011

Вы пытаетесь "повернуть" id, чтобы получить объект Python thing из результата id(thing)?Я даже не знаю, можно ли это сделать, и это определенно не должно быть сделано;это побеждает сборку мусора и ведет к недостаточной безопасности памяти.Если ваша программа делает это, это означает, что у вас фактически есть ссылки на вещи (числа id), которые сборщик мусора не знает, являются ссылками, поэтому она может освобождать объекты, которые вы все еще используете (в зависимости от того, что происходит в остальныхпрограмма).

Если вы пытаетесь прочитать необработанную память из указателя, который вы получили из расширения C или чего-то еще, то вам могут помочь другие ответы.

...