Python 程式如何高效地調試?

來源:互聯網
上載者:User

標籤:簡單   lis   origin   異常   ipython   frame   developer   list   快速鍵   

Rui L
連結:https://www.zhihu.com/question/21572891/answer/26046582
來源:知乎
著作權歸作者所有,轉載請聯絡作者獲得授權。

這個要怒答一發。
應該用過 IPython 吧?想象一下,拋出異常時自動把你帶到 IPython Shell 是不是很開心?而且和普通的IPython不同,這個時候可以調用 p (print), up(up stack), down(down stack) 之類的命令。還能建立臨時變數,執行任意函數。

事實上這是可以實現的, 而且很簡單,不過你要先安裝 IPython。然後把以下代碼儲存為 `crash_on_ipy.py`
import sysclass ExceptionHook:    instance = None    def __call__(self, *args, **kwargs):        if self.instance is None:            from IPython.core import ultratb            self.instance = ultratb.FormattedTB(mode=‘Plain‘,                 color_scheme=‘Linux‘, call_pdb=1)        return self.instance(*args, **kwargs)sys.excepthook = ExceptionHook()
然後在你的項目代碼某個地方 import crash_on_ipy 就可以了。
這個方法不需要 IDE.  想要類gdb的功能,可以使用pdb,例如:

import pdb
pdb.set_trace()

將上面2行加入到需要加斷點的代碼處,運行時,執行在此處即可中斷,單步、繼續、查看變數值等功能都有,不妨help下。董偉明
連結:https://www.zhihu.com/question/21572891/answer/123220574
來源:知乎
著作權歸作者所有,轉載請聯絡作者獲得授權。

看LZ的意思是想瞭解出現BUG怎麼調試的問題。BUG有2種:

第一種 ,直接造成了錯誤,程式拋了個異常。樓上已經講了IPython,是的。首先我先寫一個有問題的例子:

a = 1b = 0a / b

執行肯定是報錯的:

? python test.pyTraceback (most recent call last):  File "test.py", line 4, in <module>    a / bZeroDivisionError: integer division or modulo by zero

有點經驗的人一眼看去就知道 是因為分母是0造成的。可是指令碼執行結束了,要是調試還得不斷的在對應位置加print。絕招就是:

? ipython test.py --pdb---------------------------------------------------------------------------ZeroDivisionError                         Traceback (most recent call last)/Users/dongweiming/test/test.py in <module>()      2 b = 0      3 ----> 4 a / bZeroDivisionError: integer division or modulo by zero*** NameError: name ‘pdb‘ is not defined> /Users/dongweiming/test/test.py(4)<module>()      1 a = 1      2 b = 0      3 ----> 4 a / bipdb> p b  # p是print的別名0ipdb> p a1ipdb> 

程式運行在錯誤的地方,嘎.. 停住了,儲存了錯誤上下文,進入pdb環境,直接調試去吧,不要太開心。

說到這裡,ipdb(pdb)可以設定斷點、單步調試、進入函數調試、查看當前代碼、查看棧片段、動態改變變數的值等。它有很多快速鍵:

ipdb> helpDocumented commands (type help <topic>):========================================EOF    bt         cont      enable  jump  pdef    psource  run      unt   a      c          continue  exit    l     pdoc    q        s        until alias  cl         d         h       list  pfile   quit     step     up    args   clear      debug     help    n     pinfo   r        tbreak   w     b      commands   disable   ignore  next  pinfo2  restart  u        whatisbreak  condition  down      j       p     pp      return   unalias  where 

其中up,down,n,j,l,where,s, args等我都非常常用,我非常建議你每個快速鍵都瞭解一下。當然很懶的話,你們也有福利,看 Python 代碼調試技巧 。

第二種: 隱藏BUG,也就是並沒有報錯,但是輸出不符合預期,這種的比較煩,因為如果你經驗少寫的時候又不咋專心的話,基本上就得挨個地方去確認,有人說,「import pdb pdb.set_trace() 」,嗯很標準的方案,但是我一般不用。原因是什麼呢,比如調試Web應用,如果set_trace()的話,需要點多個next才能到你想調試的地方,手指頭都點木了。。所以我一般使用如下三個方法:

1. 拋異常。直接讓你想要調試的位置讓它先跑個異常,比如Flask的DEBUG的模式下,werkzeug裡面的DebuggedApplication就會把Web頁面渲染成一個可調試和可執行檔環境,直接到上面調試:
2. 在對應位置使用print和logging。這是最基礎的玩法。我一般只會在已經心理有數,只是需要看看日誌輸出來確認的時候加臨時的。平時的應用日誌也會有常規的記錄,並且會記錄堆棧(當然,使用sentry之類的方式搜集日誌是最好的),比如重要的上線過程中,出了問題但是開發環境又不好類比出來的時候,「tail -f」記錄檔們,這樣出現問題一看就看到了。 說到這裡再推薦一個很有意思的項目: GitHub - zestyping/q: Quick and dirty debugging output for tired programmers. ,它是在我看pycon2013演講中發現的,有興趣可以看看, PyVideo.org · Lightning Talks。我之前常用它。

3. 自己維護一些用於調試的庫。我會把工作中常用到的、有用的一些函數、方法搜集起來,放在一個庫裡。其中有個擷取調用棧的函數類似這樣:

import sysdef get_cur_info():    print sys._getframe().f_code.co_filename  # 當前檔案名稱    print sys._getframe(0).f_code.co_name  # 當前函數名    print sys._getframe(1).f_code.co_name # 調用該函數的函數的名字,如果沒有被調用,則返回module    print sys._getframe().f_lineno # 當前行號

可以通過看當前內容相關的調用棧的輸出來協助你揪出那個隱藏的「蟲」

Python 程式如何高效地調試?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.