亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從被攔截的被調用方獲取名稱空間

從被攔截的被調用方獲取名稱空間

瀟瀟雨雨 2021-03-19 15:11:17
我想在執行Python代碼時攔截異常并做一些報告。主要是我想在發生異常時導出代碼的名稱空間。我能做的是以下幾點:我有test.py會引發異常的文件:for i in range(10):    if i > 5:        j    else:        icheck.py當測試腳本作為參數傳遞時,將攔截異常并啟動調試器的文件:import sys, pdbtry:    __import__(sys.argv[1])except Exception as e:    pdb.post_mortem(sys.exc_info()[2])那很好。此外,我可以使用以下inspect模塊在發生異常的被調用方中找到該框架:import sys, inspecttry:    __import__(sys.argv[1])except Exception as e:    callee_frame_tuple = inspect.trace()[1]    print callee_frame_tuple輸出:(<frame object at 0x00C9B260>, 'C:\\Temp\\test.py', 3, '<module>', ['        j\n'], 0)并使用它來獲取有關框架的信息getargvalues():import sys, inspecttry:    __import__(sys.argv[1])except Exception as e:    callee_frame_tuple = inspect.trace()[1]    inspect.getargvalues(callee_named_tuple[0])[3]['__builtins__']['locals']()輸出:{'__builtins__': <module '__builtin__' (built-in)>, '__doc__': None, '__file__': 'C:\\Temp\\check.py', '__name__': '__main__', '__package__': None, 'e': NameError("name 'j' is not defined",), 'inspect': <module 'inspect' from 'C:\Python27\lib\inspect.pyc'>, 'sys': <module 'sys' (built-in)>}因此check.py,test.py盡管我將其幀引用用作getargvalues()參數,但我卻為被調用方而不是被調用方提供了本地人。有人知道如何獲取被調用方名稱空間嗎?
查看完整描述

1 回答

?
慕后森

TA貢獻1802條經驗 獲得超5個贊

從格式化的追溯記錄中還不清楚Python可以打印出什么,但是由于您正在使用__import__,所以實際上得到了兩個單獨的traceback對象。您可以像這樣訪問第二個...


import sys

from pprint import pprint


try:

    __import__(sys.argv[1])

except Exception as e:

    my_traceback = sys.exc_info()[2]


# Print locals for my stack frame

#pprint(my_traceback.tb_frame.f_locals)


# Print locals for other stack frame

other_traceback = my_traceback.tb_next

pprint(other_traceback.tb_frame.f_locals)

Python文檔的3.2節中有關于traceback和frame對象的更多信息。

更新

那是與inspect.getargvalues(callee_named_tuple[0]) 上面相同的對象,因此當我深入研究時,我不知道那實際上是被呼叫者的本地人。

你是對的。我對inspect模塊不是很熟悉-我傾向于traceback直接訪問屬性。

我期望我可以找到命名空間dict,其中i變量的值為6,然后發生異常,而這種方式我可以得到i=None。沒有辦法獲取被調用者的名稱空間嗎?

我也注意到了。使用似乎有些奇怪__import__,因為使用時它可以正常工作execfile()。以下腳本...

import sys


try:

    execfile(sys.argv[1])

except Exception as e:

    the_value_of_i = sys.exc_info()[2].tb_next.tb_frame.f_locals['i']

    print 'The value of "i" was "%r"' % the_value_of_i

產量


The value of "i" was "6"


查看完整回答
反對 回復 2021-03-29
  • 1 回答
  • 0 關注
  • 207 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號