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