如何从内存中检索对象

时间:2012-01-11 12:32:29

标签: python memory

我有一份已经运行了几个小时的工作。接近结束时,我得到一个例外,在结果变得坚持之前。但是,所有中间结果都已保存到字典对象中,我假设它在内存中。有没有办法访问这个对象?

这是示例代码

def create_rgr(frames):
    new_frames ={}
    for radec in frames.keys():
        for rframe in frames[radec]:
            rgr=subrgr(rframe,radec, store=1)
            new_frames.setdefault(radec,[]).append(rgr)

     ##Exception thrown before this point ###########

    tools.save(new_frames)

3 个答案:

答案 0 :(得分:2)

如果您想确保即使出现异常也会存储结果,您可以使用finally块:

def create_rgr(frames):
    new_frames ={}
    try:
        for radec in frames.keys():
            for rframe in frames[radec]:
                rgr=subrgr(rframe,radec, store=1)
                new_frames.setdefault(radec,[]).append(rgr)

         ##Exception thrown before this point ###########
    finally:   
        tools.save(new_frames)

答案 1 :(得分:0)

我并非100%确定我会效仿。

如果长时间运行的Python进程因异常而终止,那么就没有,你无法获得现已解散的进程在内存中的数据。

如果Python进程仍在运行,并且您可以向其中提供命令(或者可以向脚本添加命令并重新运行),那么请查看您提到的字典的内容。

我错过了什么?

答案 2 :(得分:0)

如果您已从命令行启动此过程,则可以检查回溯。

>>> def a(x): y=x; 0/0
...
>>> def b(x): a(x)
...
>>> try: b(100)
... except: import sys; e=sys.exc_info()
...
>>> e
(<type 'exceptions.ZeroDivisionError'>, ZeroDivisionError('integer division or modulo by zero',), <traceback object at 0x00B4B670>)
>>> e[2]
<traceback object at 0x00B4B670>
>>> dir(e[2])
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'tb_frame', 'tb_lasti', 'tb_lineno', 'tb_next']
>>> e[2].tb_next
<traceback object at 0x00B4B648>
>>> e[2].tb_next.tb_next
<traceback object at 0x00B4B5F8>
>>> e[2].tb_next.tb_next.tb_next
>>> e[2].tb_next.tb_next
>>> e[2].tb_next.tb_next.tb_frame
<frame object at 0x00B88060>
>>> dir(e[2].tb_next.tb_next.tb_frame)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'f_back', 'f_builtins', 'f_code', 'f_exc_traceback', 'f_exc_type', 'f_exc_value', 'f_globals', 'f_lasti', 'f_lineno', 'f_locals', 'f_restricted', 'f_trace']
>>> e[2].tb_next.tb_next.tb_frame.f_locals
{'y': 100, 'x': 100}

所以这里你有调用堆栈中所有变量的值。 AFAIK他们留在这里解决下一个例外。