使用spyder3調(diào)試python程序的實現(xiàn)步驟
說是簡明教程,其實是我自己嘗試用spyder調(diào)試python程序的過程的一個記錄,因為spyder的調(diào)試功能是基于pdb,而我又沒有pdb的基礎(chǔ),所以剛開始上手時感覺很不習(xí)慣,而且那時我又很懶,沒去找官方文檔,僅僅在百度和csdn上找了找,沒找到比較好的資料,于是放棄了,過了一段時間之后,突然又心血來潮,去找了官方文檔,外加自己的一些嘗試,總算入門了spyder的調(diào)試功能,特地記錄下來與大家共享,我使用的spyder版本是3.1.4(使用pip list命令查看spyder版本)
Spyder官方文檔地址
http://pythonhosted.org/spyder/
開始調(diào)試
先寫一個簡單的小程序用于調(diào)試:
# -*- 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開始調(diào)試。
在ipython界面會輸出如圖所示的內(nèi)容:
出現(xiàn)了ipdb提示符,說明我們已經(jīng)進入了調(diào)試模式,上面輸出的內(nèi)容可以看出是代碼的第一行,接著在提示符中輸入c(continue的縮寫,表示程序繼續(xù)向下執(zhí)行到下一個斷點),會輸出如下內(nèi)容:
程序執(zhí)行結(jié)束,可見即使我們沒有打斷點,仍然會在第一句執(zhí)行之前中斷(經(jīng)測試,中斷的時候第一句還沒有執(zhí)行),這個和我用過的其他編譯器不太一樣(比如eclipse和IntelliJ,在不打斷點的情況下會正常執(zhí)行到底),一開始還讓我困惑了一下,后來就適應(yīng)了.
如果你仔細看剛才的工具欄截圖的話,會發(fā)現(xiàn)在debug按鈕組的第五個按鈕和剛剛的c
命令是一樣的功能,但是不知道為什么,在我這個版本的spyder里有這個按鈕一些bug(具體來說就是在程序執(zhí)行結(jié)束之后不會自動退出pdb,而且之后再想使用q
命令退出也退出不了,換而言之,就是卡死在了pdb里面),如果你使用的是更高版本的spyder的話,這個bug可能已經(jīng)修復(fù)了,可以嘗試一下.
打斷點的兩種姿勢
普通的breakpoint
用spyder打斷點的方法非常簡單,只要在想打斷點的那一行行首雙擊鼠標(biāo)即可,如圖所示,我們嘗試建立一個斷點:
在每次開始debug之前,先在spyder的ipython界面中輸入%reset
把工作空間的所有變量清除,以免影響到我們接下來的測試.
按下Ctrl+F5開始debug,進行如圖所示的操作:
然后我們就到達了斷點處,從箭頭(–>)以及d:\ide\pyproject\pdbtest\test1.py(12)<module>()
中的數(shù)字12可以看出程序剛剛執(zhí)行到了第12行(也就是我們打斷點的這一行),第12行到底有沒有執(zhí)行呢?只要測試一下f變量是否存在就可以了,嘗試在ipdb中進行如下輸入:
!(python語句)
的意思就是在當(dāng)前狀態(tài)下執(zhí)行該python語句,我剛剛的用法的意思顯然是查看變量內(nèi)容,從!f
的錯誤信息可以看出f尚未定義,即第12行代碼(f='f'
)還沒有執(zhí)行,查看e變量發(fā)現(xiàn)e變量已經(jīng)被定義了,這說明第11行已經(jīng)執(zhí)行結(jié)束了。通過以上實驗可以看出,spyder會在斷點語句的執(zhí)行之前中斷
帶條件的breakpoint
雙擊剛剛在第12行代碼開頭創(chuàng)建的“小紅點”即可取消斷點。
按住Ctrl+Shift,然后像剛才一樣雙擊第12行行首,會彈出一個小框:
在這個小框內(nèi)可以輸入斷點的條件,可以是任意返回True或False的python語句,比如我輸入
(a==4)and(b==5)
然后點擊OK按鈕,發(fā)現(xiàn)小紅點上多了一個問號,這個表示條件斷點(conditional breakpoint),開始debug試一下.
發(fā)現(xiàn)程序只在第一句中斷一下,斷點根本就沒有起作用,因為在斷點的時候,a變量為'a',b變量為'b',不符合條件當(dāng)然不會中斷.
現(xiàn)在重新開始debug,然后連續(xù)按三遍Ctrl+F10,然后發(fā)現(xiàn)程序執(zhí)行到了第十行:
其實Ctrl+F10是單行執(zhí)行的意思,每按一次執(zhí)行一行,相當(dāng)于點擊了工具欄上如下圖所示的按鈕:
這個時候我可以使用剛剛講過的!(python語句)
來給a,b臨時指定一個值,在ipdb的提示符中輸入!a=4;b=5
,然后使用c命令繼續(xù)執(zhí)行,發(fā)現(xiàn)在條件斷點處中斷了,因為此時滿足了我們剛剛給條件斷點指定的條件:
如果忘記了條件斷點的條件是什么的話,可以按住Ctrl+Shift鍵雙擊“帶問號的小紅點”,然后就能看見條件是什么了,而且還可以修改條件,如果要取消斷點的話,直接雙擊就可以了。
總結(jié)一下剛剛所講的
Ctrl+F5
以Debug模式運行文件- 在debug之前記得用
%reset
指令清空一下ipython工作空間中的變量,以免影響debug中變量值的查看 - 無論你是否打斷點,都會在第一行語句執(zhí)行之前中斷一次
- !(python語句)可以在pdb提示符下執(zhí)行python語句,可以用來查看變量值或者給變量臨時指定值
- c命令或者
Ctrl+F12
可以讓程序執(zhí)行到下一個斷點 - q命令退出調(diào)試
Ctrl+F10
單行執(zhí)行- 雙擊行首設(shè)置斷點,按住
Ctrl+Shift
雙擊行首可以設(shè)置條件斷點
剩下的一些細節(jié)
上面的例子已經(jīng)包括了大多數(shù)常用的功能,如果曾經(jīng)用過別的編譯器的調(diào)試功能的話(如eclipse和IntelliJ等),看到這里就可以了,對于有調(diào)試經(jīng)驗的人來說,我下面要講的兩個功能只要看到按鈕的名稱就大概知道它是做什么的了.
如下:
Step Into
上面一張圖的按鈕的功能我們稱之為Step Into(下面一張圖的按鈕的功能我們稱之為return),用于進入一個函數(shù)體內(nèi)部,為了更清楚的說明它的功能,我們給出一個例子,在spyder中創(chuàng)建如下程序:
# -*- 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
單行執(zhí)行這個程序,當(dāng)運行到c = myTest()
這句時注意一下:
不管myTest()中有多少代碼都直接當(dāng)做一行跳了過去,用q命令退出調(diào)試。
重新debug該文件,單行執(zhí)行到c = myTest()
這行時按Ctrl+F11
使用Step Into功能,發(fā)現(xiàn)我們進入了函數(shù)內(nèi)部的代碼段:
這就Step Into的主要功能.
Return
Return的功能與Step Into的功能剛好相反,當(dāng)使用Step Into進入函數(shù)之后,按Ctrl+Shift+F11
后會直接跳到該函數(shù)的執(zhí)行的最后一行,此時在按一遍Ctrl+Shift+F11
或者Ctrl+F10
(單行執(zhí)行)就可以跳出函數(shù)了,想要嘗試的話可以自行在我上面給出的例子中嘗試.
到此這篇關(guān)于使用spyder3調(diào)試python程序的實現(xiàn)步驟的文章就介紹到這了,更多相關(guān)spyder3調(diào)試python內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python插件virtualenv搭建虛擬環(huán)境
這篇文章主要為大家詳細介紹了Python插件virtualenv搭建虛擬環(huán)境,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11pytorch中with?torch.no_grad():的用法實例
最近在看別人寫的代碼,遇到經(jīng)常使用with torch.no_grad(),所以下面這篇文章主要給大家介紹了關(guān)于pytorch中with?torch.no_grad():用法的相關(guān)資料,需要的朋友可以參考下2022-03-03python?matplotlib畫圖時坐標(biāo)軸重疊顯示不全和圖片保存時不完整的問題解決
最近工作中遇到了matplotlib保存圖片坐標(biāo)軸不完整的問題,所以這篇文章主要給大家介紹了關(guān)于python?matplotlib畫圖時坐標(biāo)軸重疊顯示不全和圖片保存時不完整問題的解決方法,需要的朋友可以參考下2022-07-07Python PyQt5 Pycharm 環(huán)境搭建及配置詳解(圖文教程)
這篇文章主要介紹了Python PyQt5 Pycharm 環(huán)境搭建及配置詳解,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python BeautifulSoup [解決方法] TypeError: list indices must be
這篇文章主要介紹了Python BeautifulSoup [解決方法] TypeError: list indices must be integers or slices, not str,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08