开发者

Read data from specific memory address / reference to object

How can I read (and put into new variable) data stored at specific memory address?

For instance I know that:

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

And I want开发者_如何学C to have data stored at 0xabd2b00 in new variable so that I can work and use all functionalities of the object. Let's assume that I don't have access to the original variable that created this object.

UPDATE: Above question has been answered so I update my question. Let's assume I have two python files: file1.py and 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 ....

At some point thread new_thread is called.

File2.py:

kolejka = nfqueue.queue()

Here the queue is created, binded and opened. Then endless loop for listening is executed. The only way to end it is to unbind and close kolejka, but I want file1.py to do that as it is a "master" programme. How can I retrieve initialized kolejka from file to close queue properly after new_thread is done?

When I try:

from file2 import kolejka

The script executes all procedure of creating queue from the beginning (it hasn't been written as a function).


You can't - there is no way to read data from a specific address. If you don't have (or can't retrieve) a reference to the object you're interested in, you're out of luck.

Besides, even if you could read data from a given address, that wouldn't help, since there would be no way for you to know which address to read from unless you have a reference to the original object. And then you wouldn't need to read raw data from memory in the first place.


Update - How to terminate the child process cleanly

There are ways to share memory between processes in Python (for example the multiprocessing module). However, this seems a bit overkill for your problem. Since you're starting the file2 process from within new_thread, the easiest solution is probably to use the signal module to let new_thread tell the file2 process to exit when the main program exits.

This allows file2.py to perform any cleanup needed before shutting down, and it's also a clean solution since file1.py doesn't need to know the details about how to shut down file2.py, making your code more modular and easier to maintain.

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)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜