繁体   English   中英

在python访问memory地址

[英]Access memory address in python

我的问题是:如何读取python中一个memory地址的内容? 例子:ptr = id(7) 我想读取ptr指向的memory的内容。 谢谢。

看看ctypes.string_at 这是一个例子。 它转储 CPython 整数的原始数据结构。

from ctypes import string_at
from sys import getsizeof

a = 0x7fff 
print(string_at(id(a),getsizeof(a)).hex())

输出:

0200000000000000d00fbeaafe7f00000100000000000000ff7f0000

请注意,这适用于 CPython 实现,因为id()恰好返回 Python 对象的虚拟内存地址,但这并不能由 Python 语言本身保证。

在 Python 中,除非与 C 应用程序交互,否则通常不会使用指针来访问内存。 如果这是您需要的,请查看访问器函数的ctypes 模块

“我要读取ptr指向的内存内容”

用 C 编写代码。使用 Python 中的代码。 http://docs.python.org/extending/extending.html

您是否试图“反转” id以从id(thing)的结果中获取 Python 对象thing 我什至不知道这是否可以做到,而且绝对不应该这样做; 它会破坏垃圾收集并导致缺乏内存安全性。 如果您的程序这样做,则意味着您有效地引用了垃圾收集器不知道是引用的事物( id号),因此它可以释放您仍在使用的对象(取决于程序其余部分发生的情况) )。

如果您试图从从 C 扩展或其他东西返回的指针中读取原始内存,那么其他答案可能会对您有所帮助。

如果您尝试访问像图像和视频这样的大型二进制文件并且不一定永远需要它们在内存中,请考虑使用[weakref][1]

您可以(例如):

import ctypes
example_string = "Hello world!"
address = id(example_string)
string_from_address = ctypes.cast(address).value
print(string_from_address)

它所做的是像往常一样导入ctypes ,创建一个示例字符串,获取它的地址,使用ctypes从 memory 转换它。最后打印它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM