用python语言调试程序你用的平台是_Python 程序如何高效地调试?
看LZ的意思是想了解出現BUG怎么調試的問題。BUG有2種:
第一種,直接造成了錯誤,程序拋了個異常。樓上已經講了IPython,是的。首先我先寫一個有問題的例子:
a = 1
b = 0
a / b
執行肯定是報錯的:
? python test.py
Traceback (most recent call last):
File "test.py", line 4, in
a / b
ZeroDivisionError: integer division or modulo by zero
有點經驗的人一眼看去就知道 是因為分母是0造成的。可是腳本執行結束了,要是調試還得不斷的在對應位置加print。絕招就是:
? ipython test.py --pdb
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/Users/dongweiming/test/test.py in ()
2 b = 0
3
----> 4 a / b
ZeroDivisionError: integer division or modulo by zero
*** NameError: name 'pdb' is not defined
> /Users/dongweiming/test/test.py(4)()
1 a = 1
2 b = 0
3
----> 4 a / b
ipdb> p b # p是print的別名
0
ipdb> p a
1
ipdb>
程序運行在錯誤的地方,嘎.. 停住了,保存了錯誤上下文,進入pdb環境,直接調試去吧,不要太開心。
說到這里,ipdb(pdb)可以設置斷點、單步調試、進入函數調試、查看當前代碼、查看棧片段、動態改變變量的值等。它有很多快捷鍵:
ipdb> help
Documented commands (type help ):
========================================
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 whatis
break 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 sys
def 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相關的內容(也可以直接搜索「Python之美」):
總結
以上是生活随笔為你收集整理的用python语言调试程序你用的平台是_Python 程序如何高效地调试?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos sudo不能运行_Linu
- 下一篇: 什么是个人自用车贷款