从特定内存地址读取数据/引用对象

3 投票
1 回答
3544 浏览
提问于 2025-04-16 08:53

我该如何读取存储在特定内存地址的数据,并把它放到一个新变量里呢?

比如说,我知道:

  <nfqueue.queue; proxy of <Swig Object of type 'queue *' at 0xabd2b00> >

我想把存储在地址0xabd2b00的数据放到一个新变量里,这样我就可以使用这个对象的所有功能。假设我没有访问创建这个对象的原始变量的权限。

更新:
上面的问题已经有人回答了,所以我更新一下我的问题。
假设我有两个Python文件:file1.py和file2.py。

file1.py:

.... rest of the code ....
class new_thread(threading.Thread):

    def __init__(self, obj):
       self.obj = obj
       threading.Thread.__init__(self)

    def run(self):
        str = 'python file2.py'
        args = shlex.split(str3)
        tmp = subprocess.Popen(args, stdout=open('/dev/null','w'), stderr=open('/dev/null', 'w'))
.... rest of the code ....

在某个时刻,会调用线程new_thread。

file2.py:

kolejka = nfqueue.queue()

在这里创建了队列,并进行了绑定和打开。然后执行了一个无限循环来监听。结束这个循环的唯一方法是解除绑定并关闭队列,但我希望file1.py来完成这个操作,因为它是“主”程序。我该如何从文件中获取初始化的队列,以便在new_thread完成后正确关闭队列呢?

当我尝试:

from file2 import kolejka

脚本会从头开始执行创建队列的所有过程(它没有被写成一个函数)。

1 个回答

4

你不能这样做——没有办法从特定的地址读取数据。如果你没有(或者无法获取)你感兴趣的对象的引用,那就没办法了。

而且,即使你从某个地址读取数据,这也没什么用,因为你根本不知道该从哪个地址读取,除非你有原始对象的引用。这样一来,你就根本不需要直接从内存中读取原始数据了。


更新 - 如何干净地终止子进程

在Python中,有一些方法可以让不同的进程共享内存(比如说 multiprocessing 模块)。不过,这对你的问题来说似乎有点复杂。因为你是从 new_thread 中启动 file2 进程,最简单的解决办法可能是使用 signal 模块,让 new_thread 在主程序退出时通知 file2 进程退出。

这样一来,file2.py 就可以在关闭之前进行必要的清理,而且这个方法也很干净,因为 file1.py 不需要知道如何关闭 file2.py 的具体细节,这样可以让你的代码更加模块化,更容易维护。

file1.py

def run(self):
    ...
    child_process = subprocess.Popen(args, ...)
    ...
    # time to quit - tell file2 to terminate
    child_process.terminate()

file2.py

import signal
import sys
...
kolejka = nfqueue.queue()
...
def sigterm_handler(signum, frame):
    # close kolejka and do any other cleanup needed, then do:
    sys.exit()

# Make sure sigterm_handler() is run when file1.py tells us
# to quit using child_process.terminate()
signal.signal(signal.SIGTERM, sigterm_handler)

撰写回答