1. 程式人生 > 實用技巧 >python--pycharm除錯

python--pycharm除錯

連線:https://blog.csdn.net/qq_33472146/article/details/90606359?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control

使用Debug除錯程式碼
1.打斷點
一個斷點標記了一個程式碼行,當Pycharm執行到該行程式碼時會將程式暫時掛起。
注意斷點會將對應的程式碼行標記為紅色,取消斷點的操作也很簡單,在同樣位置再次單擊即可。
如圖所示,打了兩個斷點

當你將滑鼠指標懸停在斷點上方時,Pycharm會顯示斷點的關鍵資訊,行號以及指令碼屬性,如果你希望更改該斷點的屬性,右擊斷點:

可以嘗試對斷點屬性進行個性化更改,然後觀察圖示的變化。
2.程式碼除錯
我們有幾種方法來debug程式
第一種:通過滑鼠右擊程式碼處,可以來debug程式

第二種:可以通過點選這個小蟲子的圖示來進行debug

接下來會Pycharm會執行以下操作:
(1)PyCharm開始執行,並在斷點處暫停
(2)斷點所在程式碼行變藍,意味著Pycharm程式程序已經到達斷點處,但尚未執行斷點所標記的程式碼。
(3)Debug tool window窗口出現,顯示當前重要除錯資訊,並允許使用者對除錯程序進行更改。
在這裡介紹一下debug視窗幾個圖示分別代表的意思

這裡一排七個座標的意思分別是
1.show execution point (F10) 顯示當前所有斷點
2.step over(F8) 單步除錯。
若函式A記憶體在子函式a時,不會進入子函式a內執行單步除錯,而是把子函式a當作一個整體,一步執行
3.step into(F7) 單步除錯。
若函式A記憶體在子函式a時,會進入子函式a內執行單步除錯。
4.step into my code(Alt + Shift +F7) 執行下一行但忽略libraries(匯入庫的語句)
5.force step into(Alt + Shift +F7) 執行下一行忽略lib和構造物件等
6.step out(Shift+F8)當目前執行在子函式a中時,選擇該除錯操作可以直接跳出子函式a,而不用繼續執行子函式a中的剩餘程式碼。並返回上一層函式。
7.run to cursor(Alt +F9) 直接跳到下一個斷點
然後接著來看變數檢視器
在除錯過程中觀察變數的狀態。我們需要對其設定一個檢視器。在Watches視窗中,單擊加號,輸入期望檢視的變數名稱,例如這裡輸入delay,然後回車。我試了三個變數,這裡我們看到這三個變數目前都是沒被定義的,我們可以在控制檯裡給它定義,也可以通過執行下一步,利用程式碼中的賦值來定義。
*注意:*這個眼鏡模樣的圖案是watch視窗(我當時可是找了半天…,網上的都是一些老版本的介紹的watch視窗,=.=)

可以通過點選這個圖示

將這兩個視窗連在一起檢視

OK,接下來我們來看控制檯視窗
Console視窗的工作模式:
  為什麼需要用到Console視窗呢?當我們需要檢視程式給出的錯誤資訊,或者進行一些額外的臨時運算時,就需要在這個窗口裡面進行。
單擊左側工具欄中的命令符按鈕,顯示Python的命令提示符(在這裡,問題又來了,新版的pycharm的那個圖示又換了,而且還隱藏的很深,這是怕別人找到了嗎。。。)
經過探索,發現在這=.=

點選這個,即可顯示python的命令提示符

在這裡做個小測試,這裡可以直接編譯python程式碼,執行一些python命令。

介紹完這些,開始進入正式除錯程式碼,我用的小例子的程式碼如下:

import threading
import time

def get_thread_name():
    t = threading.current_thread()
    return t.name

def print_time(delay):
    """Define a function for the thread."""
    thread_name=get_thread_name()
    count = 0
    while count < 8:
        time.sleep(delay)
        count += 1
        print("%s:%s" % (thread_name, time.ctime(time.time())))

t1 = threading.Thread(target=print_time, args=(1,))
t2 = threading.Thread(target=print_time, args=(2,))
t1.start()
t2.start()
t1.join()
t2.join()

除錯開始,並且在第一個斷點處停止,斷點所在的行變為藍色,說明Pycharm已經擊中了這個斷點,但尚未執行這行程式碼。

通過斷點除錯,在第一個斷點處,進行下一步操作,即可得到變數的值的變化情況


最後在介紹一下,可能有時候debug並不能正常進行,控制檯會輸出如下資訊:

程式本身應該沒有錯誤,就是不能正常debug。
下面記錄幾種解決方式:
一、關閉Pycharm,刪除工程目錄下的.idea資料夾並重啟。
二、刪除所有的斷點。可以點選下圖所示的兩個疊在一起的紅色原點進行操作。
三、點選Pycharm的File>>Invalidate Caches / Restart…,然後選擇Invalidate and Restart。這個操作清空了專案中的快取資訊。
四、重建整個工程並重新配置。
這四種方法可能會解決這個問題,我試了第三種,然後第二種應該也是可以的,第一種和第四種小心嘗試。

其實之前經常用print來進行除錯,這是一種粗暴的方法,可以直接將錯誤資訊打印出來。
嗯,經過一番折騰,也算是對pycharm的debug除錯有了一些認識,可能還有一些其它的未掌握的技巧,留著以後慢慢探索吧。