2012-01-11 206 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下一個例外。