2012-01-26 44 views
4

我想要获取所有当前堆栈帧并对每个帧的每个帧f_globals属性进行一些检查。这与unittest模块的工作方式非常相似,除了在我的情况下,还没有抛出异常。 traceback.extract_stack()不允许访问此内容,但在引发异常时sys.exc_info()会执行此操作。我如何获得所有当前堆栈帧的f_globals属性

回答

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,因为如名称开头的下划线所示,它不适合公众使用。

2
current_frame = sys._getframe(0) 

然后你可以使用f_back属性走上堆栈(直到它None)。

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

相关问题