兩種python調試方法


參考:https://mp.weixin.qq.com/s/ziUIyYPpAjq-g_CgQ_kFcQ

1、PDB

pdb是Python中的一個內置模塊,啓用pdb後可以對代碼進行斷點設置和跟蹤調試。爲了演示方便,我們準備一個樣例程序pdb_test.py:
在這裏插入圖片描述
之後在終端中輸入python -m pdb pdb_test.py命令,進入pdb的調試模式:

這時我們就可以通過各種命令控制代碼執行或者查看當前變量,例如l可以查看所有代碼,n是執行下一步代碼,p可以查看當前變量等等,需要注意的是命令n只會執行主程序中的代碼,如果想要單步執行子函數中的代碼,需要使用s指令,調試效果如下:
在這裏插入圖片描述

可以看到,通過s指令(如果只想在主函數中單步執行可以使用n)和p指令,我們控制程序單步運行並實時查看了相關變量。但是單步執行畢竟是一種效率非常低下的調試方式,尤其當代碼量比較大的時候更是噩夢,這時就需要用到pdb的set_trace()方法,我們對樣例程序pdb_test.py做一點修改:

在這裏插入圖片描述

pdb.set_trace()的作用就是在代碼中設置斷點,在pdb調試模式下,使用c命令就會直接跳轉到下一個斷點位置,如果之後沒有其他斷點就會執行完全部代碼,調試效果如下:
在這裏插入圖片描述

除了上面提到的幾個指令以外,pdb還有其他一些比較常用的命令(見下表),綜合使用基本能夠滿足日常的調試需求。
在這裏插入圖片描述


2、PySnooper

        ~~~~~~~~PySnooper也是一個Python的第三方庫,他的特點是能夠精準的顯示每條代碼的執行順序、執行時間以及隨之帶來的局部變量的改變等等。值得一提的是,作爲一個發佈不滿半年的庫,PySnooper在github上已經達到了1.2W星,其受歡迎程度可見一斑。
        ~~~~~~~~PySnooper的使用可以說是非常的方便,直接在代碼中以裝飾器的形式調用就可以了。當然在引用前你得使用pip install pysnooper或者conda install -c conda-forge pysnooper安裝這個庫。我們還是舉一個例子來進行演示,樣例代碼如下:
在這裏插入圖片描述
在上面這段代碼中,我們先是生成10個1到1000之間的隨機數,然後計算他們之中的最大最小值和中位數,唯一的不同在於第三行多了一條語句@pysnooper.snoop(),我們運行以下代碼,發現除了正常的print結果之外,多了許多內容(內容太多,下面只顯示一部分):
在這裏插入圖片描述
        ~~~~~~~~這都是PySnooper跟蹤監控的結果,正如上面所說,他準確記錄的每條代碼的運行時間、順序以及相關的變量值。作爲一個星標1.2W+的項目,PySnooper的功能肯定不會這麼簡單,@pysnooper.snoop()中是可以接收參數的,比如我們覺得輸出內容太多,可以考慮把信息記錄到log日誌中,這個功能只需要加一個log文件定位參數就能搞定:
在這裏插入圖片描述
         ~~~~~~~~~@pysnooper.snoop()支持的參數還有很多,分別對應了不同的功能,例如監控自定義表達式、監控底層函數、支持多線程等等,詳見項目文檔。此外,pysnooper還支持局部監控,一般來說我們寫的代碼都比較長,而需要監控的只是其中的一小部分,這時候就可以把需要監控的代碼放到一個block裏。我們修改下剛纔的代碼,只對計算最大最小值和中位數的部分進行監控,修改後的代碼如下:
在這裏插入圖片描述
運行之後發現監控信息精簡了很多:
在這裏插入圖片描述
使用with pysnooper.snoop()模式依然保留了對各種參數的支持,個人認爲這種模式更加符合實踐需求。

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