天天看點

使用spyder編譯器單步調試python

1、将需要進行單步調試的函數在腳本中進行調用(十分重要的一步)。由于python是解釋型語言,在進行單步調試的時候需要告訴系統你使用了這個函數,單步調試才會進入你所需要調式的函數。如下圖所示,我們定義了createDataSet()函數,在進行調試之前,要在腳本中對其進行調用,也就是下圖紅色标記的部分。

2、添加斷點。和其餘程式設計語言一樣,将斷點加入到你想要檢視結果的語句,加入的方面就是在語句前進行輕按兩下或者選中語句後點選F12按鈕。效果如下圖所示。

3、按照程式員不同的需求進行調試。spyder中提供了調式面闆,如圖所示

其中第一個按鈕是進行調試按鈕,點選或者按Ctrl+F5就進入調式,程式到達你設定的第一個斷點,這步是調式所必需的;第二個是單步調式按鈕,點選或者按Ctrl+F10就可以在設定的斷點之後單步調式;第三個按鈕可以進入到光标所在句子中含有的函數體内部,或者按快捷鍵Ctrl+F11;第四個是從此函數中跳出;第五個是跳轉到下一個斷點;最後一個按鈕是停止調試。

點選進行調試之後,可以在下圖所示的地方看到變量資訊。

使用spyder編譯器單步調試python
4.先在spyder的ipython界面中輸入%reset 把工作空間的所有變量清除,以免影響到我們接下來的測試. 
使用spyder編譯器單步調試python

引用不錯的教程:

說是簡明教程,其實是我自己嘗試用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編譯器單步調試python

點選spyder工具欄上的Debug file按鈕,或者使用快捷鍵Ctrl+F5開始調試。

在ipython界面會輸出如圖所示的内容: 

使用spyder編譯器單步調試python

出現了ipdb提示符,說明我們已經進入了調試模式,上面輸出的内容可以看出是代碼的第一行,接着在提示符中輸入c(continue的縮寫,表示程式繼續向下執行到下一個斷點),會輸出如下内容: 

使用spyder編譯器單步調試python

程式執行結束,可見即使我們沒有打斷點,仍然會在第一句執行之前中斷(經測試,中斷的時候第一句還沒有執行),這個和我用過的其他編譯器不太一樣(比如eclipse和IntelliJ,在不打斷點的情況下會正常執行到底),一開始還讓我困惑了一下,後來就适應了. 

如果你仔細看剛才的工具欄截圖的話,會發現在debug按鈕組的第五個按鈕和剛剛的’c’指令是一樣的功能,但是不知道為什麼,在我這個版本的spyder裡有這個按鈕一些bug(具體來說就是在程式執行結束之後不會自動退出pdb,而且之後再想使用’q’指令退出也退出不了,換而言之,就是卡死在了pdb裡面),如果你使用的是更高版本的spyder的話,這個bug可能已經修複了,可以嘗試一下.

打斷點的兩種姿勢

普通的breakpoint

用spyder打斷點的方法非常簡單,隻要在想打斷點的那一行行首輕按兩下滑鼠即可,如圖所示,我們嘗試建立一個斷點: 

使用spyder編譯器單步調試python

在每次開始debug之前,先在spyder的ipython界面中輸入%reset 把工作空間的所有變量清除,以免影響到我們接下來的測試. 

按下Ctrl+F5開始debug,進行如圖所示的操作: 

使用spyder編譯器單步調試python

然後我們就到達了斷點處,從箭頭(–>)以及d:\ide\pyproject\pdbtest\test1.py(12)<module>() 中的數字12可以看出程式剛剛執行到了第12行(也就是我們打斷點的這一行),第12行到底有沒有執行呢?隻要測試一下f變量是否存在就可以了,嘗試在ipdb中進行如下輸入: 

使用spyder編譯器單步調試python

!(python語句)的意思就是在目前狀态下執行該python語句,我剛剛的用法的意思顯然是檢視變量内容,從!f 的錯誤資訊可以看出f尚未定義,即第12行代碼(f='f')還沒有執行,檢視e變量發現e變量已經被定義了,這說明第11行已經執行結束了。通過以上實驗可以看出,spyder會在斷點語句的執行之前中斷

帶條件的breakpoint

輕按兩下剛剛在第12行代碼開頭建立的“小紅點”即可取消斷點。 

按住Ctrl+Shift,然後像剛才一樣輕按兩下第12行行首,會彈出一個小框: 

使用spyder編譯器單步調試python

在這個小框内可以輸入斷點的條件,可以是任意傳回True或False的python語句,比如我輸入

(a==4)and(b==5)      
  • 1

然後點選OK按鈕,發現小紅點上多了一個問号,這個表示條件斷點(conditional breakpoint),開始debug試一下. 

使用spyder編譯器單步調試python

發現程式隻在第一句中斷一下,斷點根本就沒有起作用,因為在斷點的時候,a變量為’a’,b變量為’b’,不符合條件當然不會中斷.

現在重新開始debug,然後連續按三遍Ctrl+F10,然後發現程式執行到了第十行: 

使用spyder編譯器單步調試python

其實Ctrl+F10是單行執行的意思,每按一次執行一行,相當于點選了工具欄上如下圖所示的按鈕: 

使用spyder編譯器單步調試python

這個時候我可以使用剛剛講過的!(python語句)來給a,b臨時指定一個值,在ipdb的提示符中輸入!a=4;b=5 ,然後使用c指令繼續執行,發現在條件斷點處中斷了,因為此時滿足了我們剛剛給條件斷點指定的條件: 

使用spyder編譯器單步調試python

如果忘記了條件斷點的條件是什麼的話,可以按住Ctrl+Shift鍵輕按兩下“帶問号的小紅點”,然後就能看見條件是什麼了,而且還可以修改條件,如果要取消斷點的話,直接輕按兩下就可以了。

總結一下剛剛所講的

  • Ctrl+F5 以Debug模式運作檔案
  • 在debug之前記得用%reset 指令清空一下ipython工作空間中的變量,以免影響debug中變量值的檢視
  • 無論你是否打斷點,都會在第一行語句執行之前中斷一次
  • !(python語句)可以在pdb提示符下執行python語句,可以用來檢視變量值或者給變量臨時指定值
  • c指令或者Ctrl+F12可以讓程式執行到下一個斷點
  • q指令退出調試
  • Ctrl+F10 單行執行
  • 輕按兩下行首設定斷點,按住Ctrl+Shift 輕按兩下行首可以設定條件斷點

剩下的一些細節

上面的例子已經包括了大多數常用的功能,如果曾經用過别的編譯器的調試功能的話(如eclipse和IntelliJ等),看到這裡就可以了,對于有調試經驗的人來說,我下面要講的兩個功能隻要看到按鈕的名稱就大概知道它是做什麼的了. 

如下: 

使用spyder編譯器單步調試python
使用spyder編譯器單步調試python

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() 這句時注意一下: 

使用spyder編譯器單步調試python

Return