如何访问所有当前堆栈帧的f_globals属性

时间:2012-01-26 22:16:04

标签: python

我正在尝试获取所有当前堆栈帧,并对每个帧的每个帧f_globals属性进行一些检查。这与unittest模块的工作方式非常相似,只是在我的情况下,没有抛出异常。 traceback.extract_stack()不允许访问此内容,但sys.exc_info()中的框架会在抛出异常时执行此操作。

2 个答案:

答案 0 :(得分:3)

只需使用检查模块中的“stack”功能即可。

>>> import inspect
>>> inspect.stack()
[(<frame object at 0x02467FE0>, '<stdin>', 1, '<module>', None, None)]

此调用产生一个列表,其中每个元素都是一个元组,由运行帧和该帧的额外信息组成(根据Python docs):

[frame, filename, line number, function name, frame sources, current line index in sources]

要检查每个框架对象上的f_globals

>>> for frame_tuple in inspect.stack():
...    print frame_tuple[0].f_globals.keys()
... 
['frame_tuple', '__builtins__', 'inspect', '__package__', '__name__', 'readline', 'rlcompleter', '__doc__']
但是,“堆栈”功能很慢,除了设置或调试之外,还可用于实际运行的代码。如果需要检查堆栈的某些运行时操作(如获取变量值或其他基于内省的代码),请使用inspect.currentframe()获取当前帧,并在每个帧上使用.f_back属性以获取链接以前的帧 - 这足够快。

您不应使用sys._getframe,因为,如名称开头的下划线所示,它不适合公众使用。

答案 1 :(得分:2)

current_frame = sys._getframe(0)

然后,您可以使用f_back属性向上移动堆栈(直到它为None)。

请注意,这是特定于CPython的,并被视为实现细节。