从特定内存地址读取数据/引用对象
我该如何读取存储在特定内存地址的数据,并把它放到一个新变量里呢?
比如说,我知道:
<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 个回答
你不能这样做——没有办法从特定的地址读取数据。如果你没有(或者无法获取)你感兴趣的对象的引用,那就没办法了。
而且,即使你能从某个地址读取数据,这也没什么用,因为你根本不知道该从哪个地址读取,除非你有原始对象的引用。这样一来,你就根本不需要直接从内存中读取原始数据了。
更新 - 如何干净地终止子进程
在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)