一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 使用Python中PDB模塊中的命令來調試Python代碼的教程

使用Python中PDB模塊中的命令來調試Python代碼的教程

2020-05-25 09:38Ashley Python

這篇文章主要介紹了使用Python中PDB模塊中的命令來調試Python代碼的教程,包括設置斷點來修改代碼等、對于Python團隊項目工作有一定幫助,需要的朋友可以參考下

你有多少次陷入不得不更改別人代碼的境地?如果你是一個開發團隊的一員,那么你遇到上述境地的次數比你想要的還要多。然而,Python中有一個整潔的調試特性(像其他大多數語言一樣),在這種情況下使用非常方便。本文是一篇快速教程,希望它能讓你的編碼生活更加容易。
1. 一個混亂的程序

出于本教程的目的,讓我們研究一下下面的簡單程序。

這個程序接收兩個命令行參數,然后執行加法和減法操作。

(假設用戶輸入的是有效值,因此代碼中我們沒有進行錯誤處理。)
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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,它實際上是一個交互式源代碼調試器。

你需要下面的兩行代碼來使用此模塊。
 

?
1
2
import pdb
pdb.set_trace()

看一下我們修改過的程序,里面包含了一些斷點。
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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. 程序執行觸發調試器

一旦你設置好斷點以后,你就可以像平時一樣執行程序。
 

?
1
python debugger.py 1 2

程序將會在遇到的第一個斷點處停止執行。
 

?
1
2
3
4
['debugger.py']
> /Users/someuser/debugger.py(15)main()
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb)

我們在第14行設置了一個斷點,所以我們能看到將要執行的下一行是第15行。可以看到,在執行到第15行之前程序已經停止。

在這里我們有幾個選項,讓我們在下面步驟中看看一些調試指令。
4. 下一行->n

在你的調試器提示中,輸入n運行到下一行。
 

?
1
2
3
4
5
> /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函數中。下面,就讓我們看看其他幾個令調試更加有趣的選項。

    注意:
    一個更酷的特性是你可以單擊回車鍵來執行以前的命令(在本例中只要指令n)。

5. 打印->p

下面,我們再次開始調試程序。(你可以通過單擊c使PDB跳到末尾或者直到下一個斷點,因為程序中我們并沒有其他的斷點了,所有程序將會執行完成。)
 

?
1
2
3
4
['debugger.py', '1', '2']
> /Users/someuser/debugger.py(14)main()
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb)

現在,如果我們想知道sys.argv中包含什么內容,我們可以輸入以下內容:
 

?
1
2
3
4
5
6
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb) p sys.argv
['debugger.py', '1', '2']
(Pdb) p sys.argv[1]
'1'
(Pdb)

使用這種方法可以相當方便地查看變量中實際存儲著什么值。

現在我們將進入加法函數內部。
6. 單步->s

我們可以使用“s”進入加法函數內部。

?
1
2
3
4
5
6
7
8
(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)

這將把我們帶入加法函數的內部,現在我們可以在加法函數內部使用n、p和其他的操作指令。

此時單擊“r”將會把我們帶到前面進入函數的返回語句。

如果你想快速跳轉到一個函數的結尾處,那么這個指令將很有用。
7. 動態添加斷點- > b

前面,在程序運行之前,我們使用pdb.set_trace()設置了一個斷點。

不過,經常在調試會話已經開始之后,我們想要在程序中特定的地方添加斷點。

這里我們就可以使用選項“b”來實現這種目的。

我們重新開始執行程序。
 

?
1
2
3
4
['debugger.py', '1', '2']
> /Users/someuser/debugger.py(15)main()
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb)

此時我在第18行設置一個斷點。
 

?
1
2
3
4
5
6
7
8
9
10
11
-> 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)。為了以后的執行,我們可以通過開啟或禁用斷點號碼來啟用或停用對應的斷點。
8. 列表->l

有時在調試的時候,你可能會忘記此時你處在代碼的什么地方。在這種情況下,使用“l”將會打印出一個友好的總結,它能夠顯示出此刻你在代碼中的位置。
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
['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. 動態分配變量

在調試會話期間,你可以分配變量來幫助你進行調試,知道這些對你來說也是有幫助的。例如:
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
['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指令)這樣的變量,你應該使用這種指令:
 

?
1
2
3
(Pdb) !n=5
(Pdb) p n
5

10. 結束->q

最后,在代碼的任何地方如果你想結束調試,可以使用“q”,那么正在執行的程序將會終止。
11. 擴展閱讀

本文只涉及到了PDB的表面用法,其實使用PDB你還可以做到更多(PDB 文檔)。

使用IPython的人可以在ipdb中找到一個更好的調試器,它提供了tab補充、語法高亮和其他一些很酷的特性。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99国产精品热久久久久久夜夜嗨 | 1024免费观看完整版在线播放 | 精品卡1卡2卡三卡免费视频 | 无码毛片内射白浆视频 | 国语第一次处破女 | 教师波多野结衣在线播放 | 午夜福到在线2019 | 亚洲视频免费在线观看 | 国产99视频精品免费视频免里 | 精品国语对白精品自拍视 | 亚洲品质自拍视频网站 | 久久精品国产在热亚洲 | 久久视频在线视频 | 国产91精品久久久久久久 | 日本一区二区三区精品 | 韩国最新三级网站在线播放 | 2022国产麻豆剧传媒剧情 | 欧美人曾交 | 日韩亚洲人成在线综合 | 四虎免费影院4hu永久免费 | 成年人免费在线看的惊悚动作片 | 欧美男女交配 | 私人影院在线播放 | 日韩精品视频在线播放 | 国产在线观看a | 亚洲 欧美 中文字幕 在线 | 天天有好逼 | 黑人chinese女人| 1024免费永久福利视频 | 母乳在线 | 青青青久热国产精品视频 | 2021最新国产成人精品视频 | 免费看片黄色 | 色老板免费 | 国产精品露脸国语对白手机视频 | 大陆国语自产精品视频在 | 日韩小视频在线观看 | 日韩综合一区 | 亚洲一区二区三区深夜天堂 | 欧美性xxxxxx爱| 四虎影院永久在线 |