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
浸水使柔軟