欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Python中PDB模塊中的命令來(lái)調(diào)試Python代碼的教程

 更新時(shí)間:2015年03月30日 10:47:44   作者:Ashley  
這篇文章主要介紹了使用Python中PDB模塊中的命令來(lái)調(diào)試Python代碼的教程,包括設(shè)置斷點(diǎn)來(lái)修改代碼等、對(duì)于Python團(tuán)隊(duì)項(xiàng)目工作有一定幫助,需要的朋友可以參考下

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

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

這個(gè)程序接收兩個(gè)命令行參數(shù),然后執(zhí)行加法和減法操作。

(假設(shè)用戶輸入的是有效值,因此代碼中我們沒(méi)有進(jìn)行錯(cuò)誤處理。)
 

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提供了一個(gè)有用的模塊PDB,它實(shí)際上是一個(gè)交互式源代碼調(diào)試器。

你需要下面的兩行代碼來(lái)使用此模塊。
 

import pdb
pdb.set_trace()

看一下我們修改過(guò)的程序,里面包含了一些斷點(diǎn)。
 

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. 程序執(zhí)行觸發(fā)調(diào)試器

一旦你設(shè)置好斷點(diǎn)以后,你就可以像平時(shí)一樣執(zhí)行程序。
 

python debugger.py 1 2

程序?qū)?huì)在遇到的第一個(gè)斷點(diǎn)處停止執(zhí)行。
 

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

我們?cè)诘?4行設(shè)置了一個(gè)斷點(diǎn),所以我們能看到將要執(zhí)行的下一行是第15行。可以看到,在執(zhí)行到第15行之前程序已經(jīng)停止。

在這里我們有幾個(gè)選項(xiàng),讓我們?cè)谙旅娌襟E中看看一些調(diào)試指令。
4. 下一行->n

在你的調(diào)試器提示中,輸入n運(yù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

這會(huì)執(zhí)行當(dāng)前行代碼,并準(zhǔn)備執(zhí)行下一行。

我們可以使用n來(lái)逐行執(zhí)行整個(gè)程序,但這其實(shí)沒(méi)有什么用處。

可能你已經(jīng)看到,PDB實(shí)際上并沒(méi)有進(jìn)入我們的add函數(shù)中。下面,就讓我們看看其他幾個(gè)令調(diào)試更加有趣的選項(xiàng)。

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

5. 打印->p

下面,我們?cè)俅伍_(kāi)始調(diào)試程序。(你可以通過(guò)單擊c使PDB跳到末尾或者直到下一個(gè)斷點(diǎn),因?yàn)槌绦蛑形覀儾](méi)有其他的斷點(diǎn)了,所有程序?qū)?huì)執(zhí)行完成。)
 

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

現(xiàn)在,如果我們想知道sys.argv中包含什么內(nèi)容,我們可以輸入以下內(nèi)容:
 

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

使用這種方法可以相當(dāng)方便地查看變量中實(shí)際存儲(chǔ)著什么值。

現(xiàn)在我們將進(jìn)入加法函數(shù)內(nèi)部。
6. 單步->s

我們可以使用“s”進(jìn)入加法函數(shù)內(nèi)部。

(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)

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

此時(shí)單擊“r”將會(huì)把我們帶到前面進(jìn)入函數(shù)的返回語(yǔ)句。

如果你想快速跳轉(zhuǎn)到一個(gè)函數(shù)的結(jié)尾處,那么這個(gè)指令將很有用。
7. 動(dòng)態(tài)添加斷點(diǎn)- > b

前面,在程序運(yùn)行之前,我們使用pdb.set_trace()設(shè)置了一個(gè)斷點(diǎn)。

不過(guò),經(jīng)常在調(diào)試會(huì)話已經(jīng)開(kāi)始之后,我們想要在程序中特定的地方添加斷點(diǎn)。

這里我們就可以使用選項(xiàng)“b”來(lái)實(shí)現(xiàn)這種目的。

我們重新開(kāi)始執(zhí)行程序。
 

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

此時(shí)我在第18行設(shè)置一個(gè)斷點(diǎn)。
 

-> 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行并等待下一個(gè)指令。

同時(shí),PDB還為該斷點(diǎn)分配了一個(gè)號(hào)碼(在本例中是1)。為了以后的執(zhí)行,我們可以通過(guò)開(kāi)啟或禁用斷點(diǎn)號(hào)碼來(lái)啟用或停用對(duì)應(yīng)的斷點(diǎn)。
8. 列表->l

有時(shí)在調(diào)試的時(shí)候,你可能會(huì)忘記此時(shí)你處在代碼的什么地方。在這種情況下,使用“l(fā)”將會(huì)打印出一個(gè)友好的總結(jié),它能夠顯示出此刻你在代碼中的位置。
 

['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. 動(dòng)態(tài)分配變量

在調(diào)試會(huì)話期間,你可以分配變量來(lái)幫助你進(jìn)行調(diào)試,知道這些對(duì)你來(lái)說(shuō)也是有幫助的。例如:
 

['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])

注意:
如果你想設(shè)置一些如n(即PDB指令)這樣的變量,你應(yīng)該使用這種指令:
 

(Pdb) !n=5
(Pdb) p n
5

10. 結(jié)束->q

最后,在代碼的任何地方如果你想結(jié)束調(diào)試,可以使用“q”,那么正在執(zhí)行的程序?qū)?huì)終止。
11. 擴(kuò)展閱讀

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

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

相關(guān)文章

  • python 文本單詞提取和詞頻統(tǒng)計(jì)的實(shí)例

    python 文本單詞提取和詞頻統(tǒng)計(jì)的實(shí)例

    今天小編就為大家分享一篇python 文本單詞提取和詞頻統(tǒng)計(jì)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Django rest framework實(shí)現(xiàn)分頁(yè)的示例

    Django rest framework實(shí)現(xiàn)分頁(yè)的示例

    這篇文章主要介紹了Django rest framework實(shí)現(xiàn)分頁(yè)的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 很酷的python表白工具 你喜歡我嗎

    很酷的python表白工具 你喜歡我嗎

    這篇文章主要為大家分享了一款很酷的python表白工具,可以發(fā)給女生表白用,界面簡(jiǎn)單,實(shí)用性強(qiáng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • python數(shù)據(jù)可視化Pyecharts庫(kù)sankey修改桑葚圖顏色

    python數(shù)據(jù)可視化Pyecharts庫(kù)sankey修改桑葚圖顏色

    這篇文章主要介紹了python數(shù)據(jù)化Pyecharts庫(kù)sankey修改桑葚圖顏色,文中有之前繪制桑葚圖教程鏈接,本文就來(lái)修改一下桑葚圖的顏色,有需要的朋友歡迎參閱借鑒
    2021-09-09
  • pyinstaller封裝exe的操作

    pyinstaller封裝exe的操作

    這篇文章主要介紹了pyinstaller封裝exe的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • 詳解Python中__new__和__init__的區(qū)別與聯(lián)系

    詳解Python中__new__和__init__的區(qū)別與聯(lián)系

    在Python中,每個(gè)對(duì)象都有兩個(gè)特殊的方法:__new__和__init__,本文將詳細(xì)介紹這兩個(gè)方法的不同之處以及它們之間的聯(lián)系,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Python中tkinter庫(kù)的簡(jiǎn)單使用

    Python中tkinter庫(kù)的簡(jiǎn)單使用

    這篇文章主要介紹了Python中tkinter庫(kù)的簡(jiǎn)單使用,Tkinter是Python中常用的GUI庫(kù),它使用Tk GUI工具包,并提供了創(chuàng)建各種GUI應(yīng)用程序的功能,需要的朋友可以參考下
    2023-10-10
  • python密碼學(xué)實(shí)現(xiàn)文件加密教程

    python密碼學(xué)實(shí)現(xiàn)文件加密教程

    這篇文章主要為大家介紹了python密碼學(xué)實(shí)現(xiàn)文件加密教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python實(shí)現(xiàn)快速多線程ping的方法

    Python實(shí)現(xiàn)快速多線程ping的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)快速多線程ping的方法,實(shí)例分析了Python多線程及ICMP數(shù)據(jù)包的發(fā)送技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • python兒童學(xué)游戲編程知識(shí)點(diǎn)總結(jié)

    python兒童學(xué)游戲編程知識(shí)點(diǎn)總結(jié)

    在本文里小編給大家整理了關(guān)于python兒童學(xué)游戲編程知識(shí)點(diǎn)以及內(nèi)容總結(jié),需要的朋友們參考學(xué)習(xí)下。
    2019-06-06

最新評(píng)論