我想要獲取所有當前堆棧幀並對每個幀的每個幀f_globals
屬性進行一些檢查。這與unittest
模塊的工作方式非常相似,除了在我的情況下,還沒有拋出異常。 traceback.extract_stack()
不允許訪問此內容,但在引發異常時sys.exc_info()
會執行此操作。我如何獲得所有當前堆棧幀的f_globals屬性
4
A
回答
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特定的並且被視爲實現細節。
相關問題
- 1. 如何獲得當前堆棧級別
- 2. 如何獲得使用C#的堆棧中的當前索引#
- 3. 獲取堆棧幀
- 4. 如何獲得當前幀,使用FFMpeg
- 5. 如何找到當前的堆棧?
- 6. 如何在Visual C++調試器中獲取堆棧幀的所有堆棧分配變量的大小?
- 7. 我如何獲得所有兄弟姐妹的數據屬性?
- 8. 我如何獲得堆疊面板的實際當前高度?
- 9. 如何獲得StackOverflowError的完整堆棧
- 10. 如何在「!htrace -diff」結果中獲取堆棧軌跡的所有幀?
- 11. 如何獲取當前幀?
- 12. Livecode:保存當前堆棧中的所有導入圖像
- 13. 如何獲得當前班級所屬的班級?
- 14. 如何在OpenGL中獲取矩陣堆棧的當前大小?
- 15. 堆棧,有界堆棧和Liskov替換屬性
- 16. jquery的,屬性選擇器,獲得當前屬性值
- 17. 如何溢出堆棧而不推送新的堆棧幀?
- 18. red5:我如何獲得當前的IConnection?
- 19. 堆棧幀和堆棧指針
- 20. 如何清除當前活動堆棧當啓動另一個活動屬於另一個堆棧
- 21. 如何獲得在進程中運行的所有線程的堆棧跟蹤?
- 22. 最小核心轉儲(堆棧跟蹤+僅當前幀)
- 23. 如何獲得與VS 2008調試器的所有堆棧跟蹤
- 24. Java - 捕獲所有堆棧跟蹤
- 25. 如何獲得現有.NET線程的堆棧大小
- 26. 如何捕獲所有類型的堆棧錯誤?
- 27. 如何從異常「跳」到堆棧幀?
- 28. 如何使用GDB檢查堆棧幀?
- 29. 如何獲得vlc-qt中的當前幀?
- 30. 如何獲得所有元素的路徑LXML與屬性