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