更智能的奔潰日誌:stackprinter
本工具將列印帶有代碼上下文和附近變數值的回溯信息/調用的堆棧。它回答了我對互動式調試器的大多數疑問: 它在代碼中的什麼地方出現,相關的局部變數中有什麼,以及為什麼那個函數要用這些參數調用。
它不是一個完全成熟的錯誤監控系統(https://sentry.io/welcome/ ),而只是Python內置崩潰消息的一個更有用的版本。有時候,我會在本地使用它來代替調試器,但是當我的代碼運行在只有日誌文件作為調試工具的地方時,它通常會很有用。
安裝:
使用前
使用後
默認情況下,它會盡量根據屏幕空間合理顯示。(它只顯示了一些源代碼行和函數頭,可見代碼中的變數,以及每個變數中的(?)500個字元)。你可以精確配置(https://github.com/cknd/stackprinter/blob/master/stackprinter/__init__.py#L82-L127 )冗長的信息應該如何顯示。它還嘗試了「點屬性查找」、「顯示numpy數組的結構」等高級技巧。
默認輸出的是純文本,這對日誌文件來說是很好的。出於某種原因, 它還帶有一個顏色模式 , 你可以通過向下面的任何方法傳遞 stylex="darkbg" 或 stylex="lightbg"(或"darkbg2", "darkbg3", "lightbg2", "lightbg3" )來啟用它。這是一個語義高亮(https://medium.com/@brianwill/making-semantic-highlighting-useful-9aeac92411df )的嘗試,即顏色跟隨不同的變數而不是語法來變化,就像這樣:
大圖地址:https://raw.githubusercontent.com/cknd/stackprinter/master/darkbg.png
https://raw.githubusercontent.com/cknd/stackprinter/master/notebook.png
用法
異常日誌
要全局替換默認的python崩潰消息,請在某處調用set_excepthook()。默認情況下,這將把任何未捕獲的異常列印到stderr。您還可以將此設置為你的python環境的默認設置。(https://github.com/cknd/stackprinter#making-it-stick )
要查看特定異常,請在except塊中調用show()或format()函數。默認情況下,show()會將信息列印到stderr,,而format()只返回一個字元串,用於自定義日誌記錄。
你也可以顯示地傳遞一個前面捕獲的異常對象:
你可以將特定的文件路徑列入黑名單,以使堆棧在運行這些文件時不那麼冗長。例如,調用show(exc, suppressed_paths=[r"lib/python.*/site-packages"]) 將庫中的調用縮減為每行一個。
更多配置等信息,請查看format()的文檔注釋(目前)。(https://github.com/cknd/stackprinter/blob/master/stackprinter/__init__.py#L82-L127 )
關於如何更直接地將其與logging模塊集成的一些想法,請參見demo_log .py和demo_logging_hack.py。
列印當前線程的堆棧
要查看你自己線程的當前調用堆棧,請在異常處理之外的任何地方調用show或format函數。
列印另一個線程的當前堆棧
要檢查其它任何正在運行的線程的調用堆棧信息,請使用以下代碼:
將它設置為默認
要永久替換你的python環境的崩潰消息,你可以將sitecustomize.py文件放在site-packages目錄中由python -c "import site; print(site.PREFIXES)"顯示的路徑之一下,內容如下:
這樣你每一次就會自動得到彩色的回溯信息,即使是在REPL(互動式解析器)中。
(你也可以對IPython做類似的事情,但是IPython有自己的方法,你只需要把文件放入~/.ipython/profile_default/startup目錄來代替,並且我也不想討論這個模塊是如何在IPython下設置excepthook的。)
它是如何工作的
基本上,這是一個棧幀格式化器。對於調用堆棧上的每一幀,它都會獲取源代碼,並找出哪些源代碼行引用了哪些變數。然後在最後執行的行附近顯示代碼和變數。
由於這個過程需要代碼中每個變數發生位置的映射,所以就不得不實現屏幕快照中整個語義部分某些東西的突出高亮顯示。這些顏色現在是ANSI轉義碼,但是在不使用任何80年代的終端技術的情況下呈現底層數據應該是相當簡單的。例如,一個包含可下載的pickled(序列化的)變數的可摺疊且可單擊的HTML頁面。現在,你必須通過ansi2html或其他工具來傳輸ANSI字元串。
該工具的格式和其他一切東西都受到了IPython中出色的ultratb工具的啟發。在某一天,在稍微降低了複雜性之後,我會在這裡貢獻出「找出源代碼中locals和globals中哪些變數在執行行的附近,然後只列印那些變數」這個功能的全部代碼。
警告
本工具將顯示變數被格式化時的值。在多線程程序中,當我們忙於遍歷堆棧和列印變數時,變數會改變。因此,如果沒有任何東西看起來有意義,請記住您的異常和回溯消息來自稍微不同的時間。遺憾的是,當我們想要檢查某個線程的調用堆棧時,沒有一個合理的方式可以凍結其他所有線程(…或者有這樣的方式嗎??)
跟蹤一段代碼的執行
更讓人好奇的是,您可以看著一段代碼一步一步地執行,列印所有調用跟蹤信息,並且在列印之後返回『live』。當然,這會讓整個運行過程慢下來。
或者
大圖地址:https://raw.githubusercontent.com/cknd/stackprinter/master/trace.png
文檔
*咳咳*
目前來說,你只能查看所有的文檔字元串,比如format()的這些文檔字元串。
英文原文:https://github.com/cknd/stackprinter
譯者:測試
※如何知道要測試什麼?
※表名應該複數化嗎?是用Person, Persons, People還是People?
TAG:Python部落 |