Python 在异常时从被调用方获取命名空间
我希望在执行Python代码时拦截异常并执行一些报告。我主要想在发生异常时导出代码的名称空间 我能做的是: 我有一个文件Python 在异常时从被调用方获取命名空间,python,Python,我希望在执行Python代码时拦截异常并执行一些报告。我主要想在发生异常时导出代码的名称空间 我能做的是: 我有一个文件test.py,它将引发异常: for i in range(10): if i > 5: j else: i 和文件check.py,当测试脚本作为参数传递时,该文件将拦截异常并启动调试器: import sys, pdb try: __import__(sys.argv[1]) except Exceptio
test.py
,它将引发异常:
for i in range(10):
if i > 5:
j
else:
i
和文件check.py
,当测试脚本作为参数传递时,该文件将拦截异常并启动调试器:
import sys, pdb
try:
__import__(sys.argv[1])
except Exception as e:
pdb.post_mortem(sys.exc_info()[2])
那很好
此外,我可以使用inspect
模块在被调用方中找到发生异常的帧:
import sys, inspect
try:
__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)
{'__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)>}
输出:
(<frame object at 0x00C9B260>, 'C:\\Temp\\test.py', 3, '<module>', [' j\n'], 0)
{'__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)>}
{uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,
“文件”:无,
“\uuuuuu文件”:“C:\\Temp\\check.py”,
“uuu name:”uuu main_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,
“\uuuu包”:无,
“e”:名称错误(“未定义名称“j”),
“检查”:,
'sys':}
所以我得到了check.py
的局部变量,而不是被调用方test.py
的局部变量,尽管我将它的帧引用用作getargvalues()
参数
有人知道如何获取被调用方名称空间吗?从Python打印的格式化回溯中不清楚,但是因为您使用的是
\uuuuuuu导入
,所以实际上会得到两个独立的回溯
对象。你可以像这样访问第二个
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文档中的traceback
和frame
对象有更多的信息
更新
这与
inspect.getargvalues(callee\u named\u tuple[0])的对象相同。
所以我不知道这实际上是所谓的本地人,而我
深入研究
你说得对。我不太熟悉inspect
模块-我倾向于直接访问回溯
属性
我希望能找到I
变量所在的名称空间dict
值6时发生异常,而通过这种方式我得到I=None
。是
没有办法得到被调用方的名称空间吗
我也注意到了。使用\uuuuu导入
似乎有些奇怪,因为使用时效果很好。下面的脚本
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"
这与上面的
inspect.getargvalues(callee\u named\u tuple[0])[3]
是同一个对象,所以当我深入研究时,我不知道这实际上是被调用的局部变量。我希望我能找到命名空间dict,其中I
变量(来自test.py)的值为6,因为当时发生了异常,而这样我得到I=None
。没有办法得到被调用方的名称空间吗?太好了!感谢您的帮助(阿雅:)