再見Print,用這個更香!

小編學習使用Python已經有5-6年啦,使用 Python 開發過程中,總是避免不了 Debug。小夥伴們,你們都怎樣 Debug Python 代碼,是不是常用 print 大法?

在本文介紹的這個項目中,Debug Python 代碼再也不需要 print 了。只要給有疑問的代碼加上裝飾器,各種信息一目瞭然,找出錯誤也就非常簡單了。

這個名爲 PySnooper 的項目在 GitHub 上已經收穫了13.9K+ 的 Star 量 。它類似於有斷點和監視功能的調試器。

01 如何安裝

安裝 PySnooper 的最佳方法是使用 pip:

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">pip install pysnooper</pre>

02 簡單案例介紹

該工具使用採用裝飾器的形式,將函數的運行過程以日誌的形式進行輸出,其記錄了運行了哪些代碼行,運行的時間及運行到當前代碼時各變量的值。

代碼運行詳細信息如下:

可以看到 PySnooper 把整個函數運行的過程都記錄了下來,包括:
1).代碼文件所在路徑、代碼行號等信息,以及每一行代碼調用時間信息
2).函數內局部變量 gzh_dict 的值
3).函數的 return 返回值
4).函數運行的整個時間
如果不想跟蹤整個函數,則可以將相關部分包裝在 with 塊中:

代碼運行情況如下:

03 5大進階功能

1).將輸出重定向到文件

@pysnooper.snoop() 不傳參數時,會將調試的信息輸出到標準輸出。對於單次調試就能解決的 BUG ,這樣沒有什麼問題,但是有一些 BUG 只有在特定的場景下才會出現,需要你把程序放在後面跑個一段時間才能復現。這種情況下,你可以將調試信息重定向輸出到某一日誌文件中,方便追溯排查。

2).跟蹤全局變量

PySnooper 默認是隻跟蹤函數體內的局部變量,若需要跟蹤全局變量需要給 pysnooper.snoop() 加上參數 watch.

從上可知,如果全局變量 gzh_info 的值有變化時,就會被打印出來。pysnooper.snoop() 還可以接收另外一個參數 watch_explode,和 watch 參數相反,它表示除了這幾個參數外的其他所有全局變量都監控。

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">@pysnooper.snoop(watch_explode="gzh_info")</pre>

3).設置調試日誌的前綴

當使用 PySnooper 跟蹤多個函數時,日誌輸出會顯得很亂,不方便查找文件。對於這種情況,PySnooper 提供了一個參數,方便爲不同的函數設置不同的標識,方便在查看日誌時進行區分日誌屬於哪個函數。

4).支持多線程調試模式

PySnooper 同樣支持多線程的調試,通過設置參數 thread_info=True ,它就會在日誌中打印出函數中對應的線程信息。

5).獲得程序執行時間

如果希望輸出的時間是相對於程序開始運行的時間,使用relative_time = True 即可。

6).不顯示和環境相關的信息

如果只想看代碼相關的輸出信息,設置 normalize= True 就會刪除所有與機器相關的數據(路徑,時間戳,內存地址),只顯示變量信息:

相對於其他 DEBUG 工具,例如 Pycharm 本地打斷點調試,在本地用 IDE 的圖形化界面調試無疑是最適合的,但是如果需要調試服務器的Python腳本,並且服務器只能通過堡壘機進行登陸訪問, Pycharm 的遠程調試就不好用了,PySnooper 的優勢就體現出來了。

感興趣的小夥伴趕緊去試試 PySnooper 吧。

萬水千山總是情,點個 👍 行不行。

程序員GitHub,現已正式上線!

接下來我們將會在該公衆號上,專注爲大家分享GitHub上有趣的開源庫包括Python,Java,Go,前端開發等優質的學習資源和技術,分享一些程序員圈的新鮮趣事。

目前wx搜索Python 【菜鳥學Python】排第二,匯聚了30萬Python愛好者,累計原創近400篇趣味乾貨(爬蟲,數據分析,算法,面試指南,原創趣味實戰,Python遊戲,機器學習),歡迎一起學Python,交流指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章