轉載自https://www.jianshu.com/p/082b20fcafea
說是簡明教程,其實是我自己嘗試用spyder調試python程序的過程的一個記錄,因爲spyder的調試功能是基於pdb,而我又沒有pdb的基礎,所以剛開始上手時感覺很不習慣,而且那時我又很懶,沒去找官方文檔,僅僅在百度和csdn上找了找,沒找到比較好的資料,於是放棄了,過了一段時間之後,突然又心血來潮去找了官方文檔,外加自己的一些嘗試,總算入門了spyder的調試功能,特地記錄下來與大家共享,我使用的spyder版本是3.1.4(使用pip list命令查看spyder版本)
Spyder官方文檔地址
http://pythonhosted.org/spyder/
開始調試
先寫一個簡單的小程序用於調試:
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 28 23:59:40 2017
@author: 燃燒杯
“”"
a = ‘a’
b = ‘b’
c = ‘c’
e = ‘e’
f = ‘f’
g = ‘g’
h = ‘h’
print(a)
我們暫時先不打斷點,用debug的方式運行該代碼試試
點擊spyder工具欄上的Debug file按鈕,或者使用快捷鍵Ctrl+F5開始調試。
在ipython界面會輸出如圖所示的內容:
出現了ipdb提示符,說明我們已經進入了調試模式,上面輸出的內容可以看出是代碼的第一行,接着在提示符中輸入c(continue的縮寫,表示程序繼續向下執行到下一個斷點),會輸出如下內容:
程序執行結束,可見即使我們沒有打斷點,仍然會在第一句執行之前中斷(經測試,中斷的時候第一句還沒有執行),這個和我用過的其他編譯器不太一樣(比如eclipse和IntelliJ,在不打斷點的情況下會正常執行到底),一開始還讓我困惑了一下,後來就適應了.
如果你仔細看剛纔的工具欄截圖的話,會發現在debug按鈕組的第五個按鈕和剛剛的'c'命令是一樣的功能,但是不知道爲什麼,在我這個版本的spyder裏有這個按鈕一些bug(具體來說就是在程序執行結束之後不會自動退出pdb,而且之後再想使用'q'命令退出也退出不了,換而言之,就是卡死在了pdb裏面),如果你使用的是更高版本的spyder的話,這個bug可能已經修復了,可以嘗試一下.
打斷點的兩種姿勢
普通的breakpoint
用spyder打斷點的方法非常簡單,只要在想打斷點的那一行行首雙擊鼠標即可,如圖所示,我們嘗試建立一個斷點:
在每次開始debug之前,先在spyder的ipython界面中輸入
%reset
把工作空間的所有變量清除,以免影響到我們接下來的測試.按下Ctrl+F5開始debug,進行如圖所示的操作:
然後我們就到達了斷點處,從箭頭(-->)以及d:\ide\pyproject\pdbtest\test1.py(12)<module>()
中的數字12可以看出程序剛剛執行到了第12行(也就是我們打斷點的這一行),第12行到底有沒有執行呢?只要測試一下f變量是否存在就可以了,嘗試在ipdb中進行如下輸入:
!(python語句)
的意思就是在當前狀態下執行該python語句,我剛剛的用法的意思顯然是查看變量內容,從!f
的錯誤信息可以看出f尚未定義,即第12行代碼(f='f'
)還沒有執行,查看e變量發現e變量已經被定義了,這說明第11行已經執行結束了。通過以上實驗可以看出,spyder會在斷點語句的執行之前中斷
帶條件的breakpoint
雙擊剛剛在第12行代碼開頭創建的“小紅點”即可取消斷點。
按住Ctrl+Shift,然後像剛纔一樣雙擊第12行行首,會彈出一個小框:
在這個小框內可以輸入斷點的條件,可以是任意返回True或False的python語句,比如我輸入
(a==4)and(b==5)
然後點擊OK按鈕,發現小紅點上多了一個問號,這個表示條件斷點(conditional breakpoint),開始debug試一下.
發現程序只在第一句中斷一下,斷點根本就沒有起作用,因爲在斷點的時候,a變量爲'a',b變量爲'b',不符合條件當然不會中斷.
現在重新開始debug,然後連續按三遍Ctrl+F10,然後發現程序執行到了第十行:
其實Ctrl+F10是單行執行的意思,每按一次執行一行,相當於點擊了工具欄上如下圖所示的按鈕:
這個時候我可以使用剛剛講過的!(python語句)
來給a,b臨時指定一個值,在ipdb的提示符中輸入!a=4;b=5
,然後使用c命令繼續執行,發現在條件斷點處中斷了,因爲此時滿足了我們剛剛給條件斷點指定的條件:
如果忘記了條件斷點的條件是什麼的話,可以按住Ctrl+Shift鍵雙擊“帶問號的小紅點”,然後就能看見條件是什麼了,而且還可以修改條件,如果要取消斷點的話,直接雙擊就可以了。
總結一下剛剛所講的
-
Ctrl+F5
以Debug模式運行文件 - 在debug之前記得用
%reset
指令清空一下ipython工作空間中的變量,以免影響debug中變量值的查看 - 無論你是否打斷點,都會在第一行語句執行之前中斷一次
- !(python語句)可以在pdb提示符下執行python語句,可以用來查看變量值或者給變量臨時指定值
- c命令或者
Ctrl+F12
可以讓程序執行到下一個斷點 - q命令退出調試
-
Ctrl+F10
單行執行 - 雙擊行首設置斷點,按住
Ctrl+Shift
雙擊行首可以設置條件斷點
剩下的一些細節
上面的例子已經包括了大多數常用的功能,如果曾經用過別的編譯器的調試功能的話(如eclipse和IntelliJ等),看到這裏就可以了,對於有調試經驗的人來說,我下面要講的兩個功能只要看到按鈕的名稱就大概知道它是做什麼的了.
如下:
Step Into
上面一張圖的按鈕的功能我們稱之爲Step Into(下面一張圖的按鈕的功能我們稱之爲return),用於進入一個函數體內部,爲了更清楚的說明它的功能,我們給出一個例子,在spyder中創建如下程序:
# -*- coding: utf-8 -*-
"""
Created on Tue Aug 29 14:22:46 2017
@author: 燃燒杯
“”"
def myTest():
c = ‘a’
d = ‘b’
e = ‘c’
return c
a = ‘a’
b = ‘b’
c = myTest()
f = ‘f’
print(a)
我們開始debug,不斷地按Ctrl+F10
單行執行這個程序,當運行到c = myTest()
這句時注意一下:
不管myTest()中有多少代碼都直接當做一行跳了過去,用q命令退出調試。
重新debug該文件,單行執行到c = myTest()
這行時按Ctrl+F11
使用Step Into功能,發現我們進入了函數內部的代碼段:
這就Step Into的主要功能.
Return
Return的功能與Step Into的功能剛好相反,當使用Step Into進入函數之後,按Ctrl+Shift+F11
後會直接跳到該函數的執行的最後一行,此時在按一遍Ctrl+Shift+F11
或者Ctrl+F10
(單行執行)就可以跳出函數了,想要嘗試的話可以自行在我上面給出的例子中嘗試.