Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在异常时从被调用方获取命名空间_Python - Fatal编程技术网

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

我希望在执行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 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
。没有办法得到被调用方的名称空间吗?太好了!感谢您的帮助(阿雅:)