日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

调试你的Python代码

發布時間:2025/3/17 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 调试你的Python代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

## 調試你的Python代碼

http://howchoo.com/g/zgi2y2iwyze/debugging-your-python-code


作者 Ashley


當你不得不更新別人的代碼時,你有多少次陷入這樣一種境地?如果你是一個開發團隊的一員,那我猜一定多于你愿意的次數。

結果我們發現Python (和其他語言一樣)提供了在這種情況下便利的debug特性。愿這份快速指南能使你的生活輕松些。


## 1 一段糟糕的代碼

出于本教程段目的讓我們假設如下一段簡單段程序。這段程序獲取兩個命令行參數以及加減操作。

(讓我們假設用戶輸入的參數無誤,因此無需處理異常)


? ? import sys

? ? def add(num1=0, num2=0):

? ? ? ? return int(num1) + int(num2)

? ? def sub(num1=0, num2=0):

? ? ? ? return int(num1) - int(num2)

? ? def main():

? ? ? ? #Assuming our inputs are valid numbers

? ? ? ? print sys.argv

? ? ? ? addition = add(sys.argv[1], sys.argv[2])

? ? ? ? print addition

? ? ? ? subtraction = sub(sys.argv[1], sys.argv[2])

? ? ? ? print subtraction

? ? if __name__ == '__main__':

? ? ? ? main()


## 2 加入pdb

Python自帶了名為pdb的,基于交互的源碼debug模塊。

你需要已如下方式啟用該模塊。


? ? import pdb

? ? pdb.set_trace()


加入斷點(break points) 的示例程序:


? ? import pdb

? ? import sys

? ? def add(num1=0, num2=0):

? ? ? ? return int(num1) + int(num2)

? ? def sub(num1=0, num2=0):

? ? ? ? return int(num1) - int(num2)

? ? def main():

? ? ? ? #Assuming our inputs are valid numbers

? ? ? ? print sys.argv

? ? ? ? pdb.set_trace() # <-- Break point added here

? ? ? ? addition = add(sys.argv[1], sys.argv[2])

? ? ? ? print addition

? ? ? ? subtraction = sub(sys.argv[1], sys.argv[2])

? ? ? ? print subtraction

? ? if __name__ == '__main__':

? ? ? ? main()


## 3 執行程序以觸發debugger

一旦你設置了斷點(break points),你就能像平時那樣執行程序。


? ? python debugger.py 1 2


The program will halt execution at the first break point it encounters.

程序將在遇到第一個斷點(break point)時暫停執行。


? ? ['debugger.py']

? ? > /Users/someuser/debugger.py(15)main()

? ? -> addition = add(sys.argv[1], sys.argv[2])

? ? (Pdb)


我們在第14行設置了斷點(break point),我們會看到下次被執行的將是第15行。

程序在執行第15行前暫停了。

我們在這里有一些選擇。。。讓我們在接下來的步驟中展示其中一部分。


## 4 下一行 -> n


在debugger提示符處 按"n" 會到下一行。


? ? > /Users/someuser/debugger.py(14)main()

? ? -> addition = add(sys.argv[1], sys.argv[2])

? ? (Pdb) n

? ? > /Users/someuser/debugger.py(15)main()

? ? -> print addition


這會執行當前行并準備好執行下一行。


我們雖然能夠通過使用"n" 來一行行執行程序,但這樣不是太有用。

你可能已經注意到了pdb實際上并沒有進入add函數中。讓我們在看看debugger的其他選項,使排錯變得更有趣。


? ? 注意:

? ? ?另一個酷酷的特性是按回車鍵會執行你之前執行過的命令(本例中為"n")。


## 5 打印 ->p

讓我們再次開始debug吧!(既然我們沒有任何程序會執行完。你可以敲擊"c"使pdb跳至最后或者下一個斷點(break point)


? ? ['debugger.py', '1', '2']

? ? > /Users/someuser/debugger.py(14)main()

? ? -> addition = add(sys.argv[1], sys.argv[2])

? ? (Pdb)


現在如果我們想知道sys.argv包含了哪些參數,我們可以這么干:


? ? -> addition = add(sys.argv[1], sys.argv[2])

? ? (Pdb) p sys.argv

? ? ['debugger.py', '1', '2']

? ? (Pdb) p sys.argv[1]

? ? '1'

? ? (Pdb)


這在檢測變量實際存儲的值時非常有用。


現在讓我們進入add函數內部


## 6 進入函數 -> s

我們可以通過使用"s"來進入我們的addition函數。


? ? (Pdb) s

? ? --Call--

? ? > /Users/someuser/debugger.py(4)add()

? ? -> def add(num1=0, num2=0):

? ? (Pdb) n

? ? > /Users/someuser/debugger.py(5)add()

? ? -> return int(num1) + int(num2)

? ? (Pdb)


這使我們來到了add函數的內部,現在我們能夠在其中使用"n, p"以及其他操作了。


這時敲擊"r"會跳轉至所進入函數的返回語句處。(譯注:再次敲擊時會跳轉至函數調用處)


這在你想快速跳轉至方法結尾時很有用。


## 7 動態添加斷點(break point) -> b

我們在運行程序前通過pdb.set_trace()設置了斷點(break point)


通常在debugger開始后,我們會想在一些特定的位置設置斷點(break point)


好××× "b" 登場。


讓我們再次執行我們的程序。


? ? ['debugger.py', '1', '2']

? ? > /Users/someuser/debugger.py(15)main()

? ? -> addition = add(sys.argv[1], sys.argv[2])

? ? (Pdb)


現在我在第18行設置一個斷點(break point)。


? ? -> addition = add(sys.argv[1], sys.argv[2])

? ? (Pdb) b 18

? ? Breakpoint 1 at /Users/someuser/debugger.py:18

? ? (Pdb) c

We are in add--

3

? ? > /Users/someuser/debugger.py(18)main()

? ? -> print subtraction

? ? (Pdb) p subtraction

? ? -1

? ? (Pdb)


如我們所見,pdb直接跳至第18行并等待進一步指令。


pdb也會給斷點賦一個數字(本例中為數字1)。我們能夠使用(原文為"user" 疑似筆誤)

enable/disable 斷點(break point)數字再進一步執行中啟用或關閉相對應的斷點(break point)。


## 8 列表 -> l

有時在debug的過程中,你會迷失于代碼中。此時,你可以使用"l"來輸出一個格式良好的摘要來告知你你身在何處。# 斟酌


? ? ['debugger.py', '1', '2']

? ? > /Users/someuser/debugger.py(15)main()

? ? -> addition = add(sys.argv[1], sys.argv[2])

? ? (Pdb) l

? ? ?10

? ? ?11 ? ? def main():

? ? ?12 ? ? ? ? #Assuming our inputs are valid numbers

? ? ?13 ? ? ? ? print sys.argv

? ? ?14 ? ? ? ? pdb.set_trace() # <-- Break point added here

? ? ?15 ?-> ? ? addition = add(sys.argv[1], sys.argv[2])

? ? ?16 ? ? ? ? print addition

? ? ?17 ? ? ? ? subtraction = sub(sys.argv[1], sys.argv[2])

? ? ?18 ? ? ? ? print subtraction



## 9 給變量動態賦值

在debug時,能給變量賦值也有助于排錯。

假設:


? ? ['debugger.py', '1', '2']

? ? > /Users/someuser/debugger.py(15)main()

? ? -> addition = add(sys.argv[1], sys.argv[2])

? ? (Pdb) n

? ? We are in add--

? ? > /Users/someuser/debugger.py(16)main()

? ? -> print addition

? ? (Pdb) p addition

? ? 3 #<--- addition here is 3

? ? (Pdb) addition = 'this is now string' #<--- We changed the value of additon

? ? (Pdb) n

? ? this is now string #<--- Now when we print it we actually gets it as a string. that we just set above.

? ? > /Users/someuser/debugger.py(17)main()

? ? -> subtraction = sub(sys.argv[1], sys.argv[2])


注意:


如果你想給像"n"這樣的變量賦值(即同時也是pdb 命令),你需要這樣做:


? ? (Pdb) !n=5

? ? (Pdb) p n

? ? 5


## 10 退出 -> q

最后你可以通過"q",在任何時刻退出。程序執行會被終止。


## 11 擴展閱讀

本文僅僅觸及pdb的表面。還有更多的文檔在向你招手!


那些使用ipython的能夠在ipdb中找到更好的debugger:tab補全,語法高亮以及其他酷酷的特性。


如果你有其他使用pdb的有趣方法請在下面評論


排錯愉快!


轉載于:https://blog.51cto.com/7702323/1623555

總結

以上是生活随笔為你收集整理的调试你的Python代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。