2012-01-11 123 views
0

我有一份工作已运行数小时。到最后,我得到了一个例外,在结果持续之前。然而,所有的中间结果都被保存到字典对象中,我假设它在内存中。有没有办法访问这个对象?如何从内存中检索对象

这是示例代码

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

你试图做什么的目的仍然不清楚,但为什么不只是做一个尝试/除了在除了你应该有权访问该字典的部分。 – Bogdan 2012-01-11 12:41:31

+1

@Bogdan,你说的是对的。我只是忘了包含try/except块!现在我必须再次运行这项工作! – user739807 2012-01-11 12:44:56

回答

0

我肯定不遵循100%。

如果由于异常而导致长时间运行的Python进程终止,那么no,您将无法获取已停止执行的进程在内存中的数据。

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

我错过了什么?

+0

我想你已经回答了我的问题! - 已抛出异常! – user739807 2012-01-11 12:40:10

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) 
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他们仍然在这里untik下一个例外。