【问题标题】:Access memory address in python在python中访问内存地址
【发布时间】:2012-01-05 05:49:55
【问题描述】:

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

【问题讨论】:

  • 这到底是什么目标?
  • Python 没有可以访问任意内存的指针。
  • @GregHewgill:在我看来,程序实际上可以像其他语言一样访问内存(通过 ctypes 模块——参见 Mark Tolonen 的回答)。

标签: python memory memory-address


【解决方案1】:

看看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 语言本身不能保证这一点。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      "我要读取ptr指向的内存内容"

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 出于好奇,不久前我测试了通过id(thing) 恢复deleted 对象。这确实是可能的,但是(取决于垃圾收集)通常会导致退出时双释放。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2010-11-01
          • 1970-01-01
          • 2010-09-12
          • 2021-10-28
          • 1970-01-01
          • 2013-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多