2012-01-26 81 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特定的並且被視爲實現細節。

相關問題