當前位置:編程學習大全網 - 編程語言 - Python代碼調試的幾種方法綜述

Python代碼調試的幾種方法綜述

使用pdb調試

Pdb是python附帶的壹個包。它為python程序提供了交互式源代碼調試功能。其主要功能包括設置斷點、單步調試、進入函數調試、查看當前代碼、查看堆棧片段、動態改變變量值等。Pdb提供了壹些常用的調試命令,詳見表1。

表1。pdb常用命令

下面用具體例子說明如何使用pdb進行調試。

清單1。測試代碼示例

導入pdb

a = "aaa "

pdb.set_trace()

b = "bbb "

c = "ccc "

最終= a + b + c

最終打印

開始調試:直接運行腳本,它會停留在pdb.set_trace()。選擇n+enter執行當前語句。第壹次按n+enter後,可以直接按enter重復上壹次的調試命令。

清單2。使用pdb調試

[root @ RCC-pok-IDG-2255 ~]# python epdb 1 . py

& gt/root/epdb1.py(4)?()

-& gt;b = "bbb "

(Pdb) n

& gt/root/epdb1.py(5)?()

-& gt;c = "ccc "

(Pdb)

& gt/root/epdb1.py(6)?()

-& gt;最終= a + b + c

(Pdb)列表

1導入pdb

2 a = "aaa "

3 pdb.set_trace()

4 b = "bbb "

5 c = "ccc "

6->;最終= a + b + c

7最終打印

[EOF]

(Pdb)

[EOF]

(Pdb) n

& gt/root/epdb1.py(7)?()

-& gt;最終打印

(Pdb)

退出調試:quit或者q可以退出當前的調試,但是Quit會以非常粗暴的方式退出程序,結果是直接死機。

清單3。退出調試

[root @ RCC-pok-IDG-2255 ~]# python epdb 1 . py

& gt/root/epdb1.py(4)?()

-& gt;b = "bbb "

(Pdb) n

& gt/root/epdb1.py(5)?()

-& gt;c = "ccc "

(Pdb) q

回溯(最近壹次呼叫):

文件“epdb1.py”,第5行,在?

c = "ccc "

文件“epdb1.py”,第5行,在?

c = "ccc "

文件“/usr/lib64/python2.4/bdb.py”,trace_dispatch中的第48行

return self.dispatch_line(幀)

文件“/usr/lib64/python2.4/bdb.py”,dispatch_line中的第67行

如果自己退出:提出BdbQuit

bdb。BdbQuit

打印變量值:如果調試時需要打印變量值,可以直接用p加變量名,但需要註意的是,打印只能在當前語句執行完之後才能看到具體的值,否則會報錯壹個NameError: error。

清單4。調試期間打印變量

[root @ RCC-pok-IDG-2255 ~]# python epdb 1 . py

& gt/root/epdb1.py(4)?()

-& gt;b = "bbb "

(Pdb) n

& gt/root/epdb1.py(5)?()

-& gt;c = "ccc "

(Pdb)

bbb '

(Pdb)

bbb '

(Pdb) n

& gt/root/epdb1.py(6)?()

-& gt;最終= a + b + c

(Pdb)個人電腦

ccc '

(Pdb) p最終

***名稱錯誤:

(Pdb) n

& gt/root/epdb1.py(7)?()

-& gt;最終打印

(Pdb) p最終

' aaabbbccc '

(Pdb)

使用C停止當前調試並繼續程序執行。如果set_statement()的語句在後面的程序中繼續,將重新進入調試狀態,讀者可以在代碼打印final之前添加set_trace()驗證。

清單5。停止調試並繼續執行程序

[root @ RCC-pok-IDG-2255 ~]# python epdb 1 . py

& gt/root/epdb1.py(4)?()

-& gt;b = "bbb "

(Pdb) n

& gt/root/epdb1.py(5)?()

-& gt;c = "ccc "

(Pdb) c

aaaabbbccc

顯示代碼:調試時可能不記得當前代碼塊。如果要查看特定的代碼塊,可以使用list或l命令來顯示它。列表將使用箭頭-& gt;指向當前調試的語句。

清單6。調試期間顯示代碼

[root @ RCC-pok-IDG-2255 ~]# python epdb 1 . py

& gt/root/epdb1.py(4)?()

-& gt;b = "bbb "

(Pdb)列表

1導入pdb

2 a = "aaa "

3 pdb.set_trace()

4->;b = "bbb "

5 c = "ccc "

6最終= a + b + c

7 pdb.set_trace()

8最終打印

[EOF]

(Pdb) c

& gt/root/epdb1.py(8)?()

-& gt;最終打印

(Pdb)列表

3 pdb.set_trace()

4 b = "bbb "

5 c = "ccc "

6最終= a + b + c

7 pdb.set_trace()

8->;最終打印

[EOF]

(Pdb)

用函數調試。

清單7。使用函數的示例

導入pdb

def combine(s1,s2): #定義子例程combine,它...

s3 = s1 + s2 + s1 #將s2夾在s1的副本之間,...

s3 = '"' + s3 +'"' #用雙引號括起來,...

返回s3 #並返回它。

a = "aaa "

pdb.set_trace()

b = "bbb "

c = "ccc "

最終=合並(a,b)

最終打印

如果直接用n進行調試,到了final=combine(a,b)的句子,就當作普通的賦值語句,輸入print final。如果妳想調試壹個函數呢?可以直接用s進入功能塊。函數中的單步調試類似於上面的介紹。如果不想壹步調試壹個函數,可以直接在斷點處按R退出到調用處。

清單8。調試功能

[root @ RCC-pok-IDG-2255 ~]# python epdb 2 . py

& gt/root/epdb2.py(10)?()

-& gt;b = "bbb "

(Pdb) n

& gt/root/epdb2.py(11)?()

-& gt;c = "ccc "

(Pdb) n

& gt/root/epdb2.py(12)?()

-& gt;最終=合並(a,b)

(Pdb) s

-打電話-

& gt/root/epdb2.py(3)combine()

-& gt;def combine(s1,s2): #定義子例程combine,它...

(Pdb) n

& gt/root/epdb2.py(4)combine()

-& gt;s3 = s1 + s2 + s1 #將s2夾在s1的副本之間,...

(Pdb)列表

1導入pdb

2

3 def combine(s1,s2): #定義子程序combine,其中...

4->;s3 = s1 + s2 + s1 #將s2夾在s1的副本之間,...

5 s3 = '"' + s3 +'"' #用雙引號括起來,...

6返回s3 #並返回它。

8 a = "aaa "

9 pdb.set_trace()

10 b = "bbb "

11 c = "ccc "

(Pdb) n

& gt/root/epdb2.py(5)combine()

-& gt;s3 = '"' + s3 +'"' #用雙引號括起來,...

(Pdb) n

& gt/root/epdb2.py(6)combine()

-& gt;返回s3 #並返回它。

(Pdb) n

-返回-

& gt/root/epdb 2 . py(6)combine()-& gt;" aaabbbaaa "

-& gt;返回s3 #並返回它。

(Pdb) n

& gt/root/epdb2.py(13)?()

-& gt;最終打印

(Pdb)

在調試期間動態更改該值。您可以在調試過程中動態更改變量的值,如下例所示。需要註意的是,下面有壹個錯誤,因為B被賦值了。如果妳想再次改變B的賦值,妳應該使用它!乙.

清單9。調試時動態更改值

[root @ RCC-pok-IDG-2255 ~]# python epdb 2 . py

& gt/root/epdb2.py(10)?()

-& gt;b = "bbb "

(Pdb) var = "1234 "

(Pdb) b = "avfe "

***指定的對象“= "avfe "”不是函數

或者在sys.path中找不到。

(Pdb)!b="afdfd "

(Pdb)

pdb調試的壹個明顯缺陷是對多線程和遠程調試支持不夠好,沒有直觀的界面展示,不適合大型python項目。在較大的python項目中,這些調試需求很常見,因此需要更高級的調試工具。接下來將介紹PyCharm IDE的調試方法。

使用PyCharm調試

PyCharm是JetBrains打造的Python IDE,具有語法高亮、項目管理、代碼跳轉、智能提示、自動完成、單元測試、版本控制等功能。同時為Django開發和Google App Engine提供支持。分為個人獨立版和商業版,需要license的支持,或者妳可以獲得30天的免費試用。Pycharm的試用版可以從官網下載:/py charm/py charm/download/index . html py charm還提供了比較完善的調試功能,支持多線程、遠程調試等。,並能支持斷點設置、單步模式、表達式求值、變量查看等壹系列功能。PyCharm IDE的調試窗口布局如圖1所示。

圖1。PyCharm IDE窗口布局

下面用例子描述如何使用PyCharm進行多線程調試。有關用於特定調試的代碼示例,請參見清單10。

清單10。PyCharm調試代碼示例

__作者__ = '張穎'

#!/usr/bin/python

導入線程

導入時間

#為線程定義壹個函數

def print_time(線程名,延遲):

計數= 0

而count count += 1

打印“% s:% s”%(thread name,time.ctime(time.time()))

def check_sum(threadName,valueA,valueB):

打印“計算兩個數之和”

結果=總和(值a,值b)

打印“結果是”,結果;

def sum(valueA,valueB):

如果valueA & gt0和值& gt0:

返回值a+值b

def readFile(線程名,文件名):

文件=打開(文件名)

對於file.xreadlines()中的行:

打印行

嘗試:

Thread . start _ new _ Thread(print _ time,(" Thread-1 ",2,) )

Thread . start _ new _ Thread(check _ sum,(“線程2”,4,5,) )

Thread . start _ new _ Thread(readFile,(“Thread-3”,“test.txt”,))

除了:

打印“錯誤:無法啟動線程”

而1:

#打印“結束”

及格

在調試之前,通常需要設置斷點,斷點可以設置在循環或條件判斷的表達式處,也可以設置在程序的關鍵點處。設置斷點的方法很簡單:將光標移動到代碼編輯框中需要設置斷點的那壹行,然後直接按Ctrl+F8或者選擇菜單“運行”-& gt;“切換行斷點”,更直接的方法是雙擊代碼編輯處的左邊緣,可以看到壹個紅點(如圖2)。當調試開始時,當前正在執行的代碼將直接顯示為藍色。下圖中設置了三個斷點,正在執行的代碼以藍色突出顯示。

圖二。斷點設置

表達式求值:在調試過程中,有時需要跟蹤壹些表達式的值來發現程序中的問題。Pycharm支持表達式求值。妳可以選擇表達式,然後選擇“運行”->;“評估表達式”,您可以通過在出現的窗口中直接選擇評估來查看它。

Pychar提供了變量和監視窗口,在這些窗口中,調試步驟中涉及的特定變量的值可以直接在變量列中查看。

圖3。可變視圖

如果想動態監控某個變量,可以直接選擇該變量,選擇菜單“運行”->;“添加觀察”被添加到“觀察”列。當調試到變量所在的語句時,可以在這個窗口中直接看到變量的具體值。

圖4。監控變量

對於多線程程序,通常有多個線程。當需要調試的斷點設置在不同線程對應的線程體中時,通常要求IDE對多線程調試有很好的支持。在Pycharm中,當主線程提升線程時,會自動生成壹個名為Dummy的虛擬線程,每壹幀對應壹個自己的調試幀。如圖5所示,在這個例子中,壹個* * *有四個線程,其中主線程生成三個線程,分別是Dummy-4、Dummy-5和Dummy-6。Dummy-4對應線程1,其他分別對應線程2和線程3。

圖5。多線程窗口

當調試進入每個線程的子程序時,框架會自動切換到其對應的框架,進程對應的相關變量也會顯示在對應的變量列中,如圖6所示。直接控制調試按鈕,如setp in和step over,以便於調試。

圖6。子線程調試

使用PyDev調試

PyDev是壹個開源插件,可以很容易地與Eclipse集成,提供方便而強大的調試功能。同時,作為壹款優秀的Python IDE,還提供了語法錯誤提示、源代碼編輯助手、快速大綱、Globals瀏覽器、層次視圖、運行等強大功能。下面介紹如何將PyDev與Eclipse集成在壹起。在安裝PyDev之前,需要安裝Java 1.4或更高版本,Eclipse和Python。第壹步:啟動Eclipse,在Eclipse菜單欄中找到幫助欄,選擇Help >;安裝新軟件,選擇“添加”按鈕,添加Ptdev的下載站點和命令。"

返回

tn = telnetlib。Telnet() #

嘗試:

tn.open(主機)

除了:

打印“無法打開主機”

返回

tn.read_until("login:")

tn.write(用戶+'

)

如果通過:

tn.read_until("Password:")

tn.write(PASS +'

)

tn.write(COMMAND +'

)

tn.write("退出

")

tmp = tn.read_all()

tn.close()

德爾tn

浸水使柔軟

  • 上一篇:編程輸入小寫字母
  • 下一篇:如何使小學課堂玩具不做學具
  • copyright 2024編程學習大全網