🚀 在 VS Code 中免費取得

VS Code 中的 Python 偵錯

Python 擴充功能支援透過 Python 偵錯工具擴充功能 偵錯數種 Python 應用程式類型。如需基本偵錯的簡短逐步解說,請參閱教學課程 - 設定並執行偵錯工具。另請參閱 Flask 教學課程。這兩個教學課程都會示範核心技能,例如設定中斷點和逐步執行程式碼。

如需一般偵錯功能,例如檢查變數、設定中斷點和其他與語言無關的活動,請檢閱VS Code 偵錯

本文主要說明 Python 特有的偵錯組態,包括特定應用程式類型和遠端偵錯的必要步驟。

Python 偵錯工具擴充功能

Python 偵錯工具擴充功能 會與 VS Code 的 Python 擴充功能 一起自動安裝。它提供使用 debugpy 進行偵錯的功能,適用於數種 Python 應用程式類型,包括腳本、Web 應用程式、遠端程序等等。

若要確認是否已安裝,請開啟 [擴充功能] 檢視 (⇧⌘X (Windows、Linux Ctrl+Shift+X)),並搜尋 @installed python debugger。您應該會在結果中看到 Python 偵錯工具擴充功能。

Python Debugger extension shown in installed extensions view in VS Code.

您可以參考擴充功能的 README 頁面,以取得支援的 Python 版本資訊。

初始化組態

組態會驅動 VS Code 在偵錯工作階段期間的行為。組態定義在 launch.json 檔案中,該檔案儲存在工作區的 .vscode 資料夾中。

注意:若要變更偵錯組態,您的程式碼必須儲存在資料夾中。

若要初始化偵錯組態,請先在側邊欄中選取 [執行] 檢視

Run icon

如果您尚未定義任何組態,您會看到一個 [執行和偵錯] 按鈕,以及一個用於建立組態 (launch.json) 檔案的連結

Debug toolbar settings command

若要產生包含 Python 組態的 launch.json 檔案,請執行下列步驟

  1. 選取 [建立 launch.json 檔案] 連結 (如上方影像中所示),或使用 [執行] > [開啟組態] 功能表命令。

  2. 從偵錯工具選項清單中選取 [Python 偵錯工具]。

  3. 命令選擇區會開啟組態功能表,讓您選擇要用於 Python 專案檔案的偵錯組態類型。如果您想要偵錯單一 Python 腳本,請在出現的 [選取偵錯組態] 功能表中選取 [Python 檔案]。

    List of Python debugger configuration options

    注意:在沒有組態的情況下,透過 [偵錯] 面板、F5 或 [執行 > 開始偵錯] 啟動偵錯工作階段也會顯示偵錯組態功能表,但不會建立 launch.json 檔案。

  4. Python 偵錯工具擴充功能接著會建立並開啟 launch.json 檔案,其中包含根據您先前選取的內容 (在此案例中為 [Python 檔案]) 的預先定義組態。您可以修改組態 (例如新增引數),也可以新增自訂組態。

    Configuration json

組態屬性的詳細資訊稍後會在本文的 標準組態和選項 中涵蓋。其他組態也會在本文的 偵錯特定應用程式類型 中說明。

其他組態

根據預設,VS Code 只會顯示 Python 偵錯工具擴充功能提供的最常見組態。您可以使用清單和 launch.json 編輯器中顯示的 [新增組態] 命令,選取要包含在 launch.json 中的其他組態。當您使用此命令時,VS Code 會提示您提供所有可用組態的清單 (請務必選取 [Python] 選項)

Adding a new Python debugging configuration

選取 [使用程序識別碼附加] 會產生下列結果: 已新增組態

如需所有這些組態的詳細資訊,請參閱 偵錯特定應用程式類型

在偵錯期間,狀態列會顯示目前的組態和目前的偵錯解譯器。選取組態會顯示一個清單,您可以從中選擇不同的組態

Debugging Status Bar

根據預設,偵錯工具會使用為您的工作區選取的相同解譯器,就像 VS Code 的 Python 擴充功能的其他功能一樣。若要特別為偵錯使用不同的解譯器,請在適用偵錯工具組態的 launch.json 中設定 python 的值。或者,使用狀態列上的 Python 解譯器指標來選取不同的解譯器。

基本偵錯

如果您只對偵錯 Python 腳本感興趣,最簡單的方式是選取編輯器上執行按鈕旁邊的向下箭頭,然後選取 [Python 偵錯工具:偵錯 Python 檔案]。

Debug button on the top-right of the editor

如果您想要使用 Flask、Django 或 FastAPI 偵錯 Web 應用程式,Python 偵錯工具擴充功能會在 [執行和偵錯] 檢視中,透過 [顯示所有自動偵錯組態] 選項,根據您的專案結構動態建立偵錯組態。

Show all automatic debug configurations option on the run view

但如果您想要偵錯其他種類的應用程式,您可以透過按一下 [執行] 檢視中的 [執行和偵錯] 按鈕來啟動偵錯工具。

Run the debugger

當未設定任何組態時,系統會提供偵錯選項清單。在這裡,您可以選取適當的選項來快速偵錯您的程式碼。

兩個常見的選項是使用 [Python 檔案] 組態來執行目前開啟的 Python 檔案,或是使用 [使用程序識別碼附加] 組態將偵錯工具附加至已在執行的程序。

如需建立和使用偵錯組態的相關資訊,請參閱初始化組態其他組態章節。新增組態後,可以從下拉式清單中選取組態,然後使用 [開始偵錯] 按鈕 (F5) 啟動。

Start debugging button in the Run and Debug view

命令列偵錯

如果您的 Python 環境中已安裝 debugpy,也可以從命令列執行偵錯工具。

安裝 debugpy

您可以使用 python -m pip install --upgrade debugpydebugpy 安裝到您的 Python 環境中。

提示:雖然不一定要使用虛擬環境,但建議使用最佳做法。您可以在 VS Code 中建立虛擬環境,方法是開啟命令選擇區 (⇧⌘P (Windows、Linux Ctrl+Shift+P)) 並執行 [Python:建立虛擬環境] 命令 ()。

命令列語法

偵錯工具命令列語法如下

python -m debugpy
    --listen | --connect
    [<host>:]<port>
    [--wait-for-client]
    [--configure-<name> <value>]...
    [--log-to <path>] [--log-to-stderr]
    <filename> | -m <module> | -c <code> | --pid <pid>
    [<arg>]...

範例

從命令列中,您可以使用指定的連接埠 (5678) 和腳本,使用下列語法啟動偵錯工具。此範例假設腳本執行時間很長,並省略 --wait-for-client 旗標,表示腳本不會等待用戶端附加。

python -m debugpy --listen 5678 ./myscript.py

接著,您會使用下列組態從 VS Code Python 偵錯工具擴充功能附加。

{
  "name": "Python Debugger: Attach",
  "type": "debugpy",
  "request": "attach",
  "connect": {
    "host": "localhost",
    "port": 5678
  }
}

注意:指定主機對於 listen 是選擇性的,預設會使用 127.0.0.1。

如果您想要偵錯遠端程式碼或在 Docker 容器中執行的程式碼,在遠端機器或容器上,您需要修改先前的 CLI 命令以指定主機。

python -m debugpy --listen 0.0.0.0:5678 ./myscript.py

接著,相關聯的組態檔案看起來會如下所示。

{
  "name": "Attach",
  "type": "debugpy",
  "request": "attach",
  "connect": {
    "host": "remote-machine-name", // replace this with remote machine name
    "port": 5678
  }
}

注意:請注意,當您指定主機值不是 127.0.0.1localhost 時,您會開啟連接埠以允許從任何機器存取,這會帶來安全性風險。在執行遠端偵錯時,您應該確定您已採取適當的安全性預防措施,例如使用 SSH 通道。

命令列選項

旗標 選項 描述
--listen--connect [<host>:]<port> 必要。指定偵錯配接器伺服器要等待連入連線 (--listen) 或連線至等待連入連線的用戶端的的主機位址和連接埠 (--connect)。這與 VS Code 偵錯組態中使用的位址相同。根據預設,主機位址為 localhost (127.0.0.1)
--wait-for-client 選擇性。指定程式碼在與偵錯伺服器連線之前不應執行。此設定可讓您從程式碼的第一行開始偵錯。
--log-to <path> 選擇性。指定現有目錄的路徑,以儲存記錄。
--log-to-stderr 選擇性。啟用 debugpy 以將記錄直接寫入 stderr。
--pid <pid> 選擇性。指定已在執行的程序,以將偵錯伺服器注入其中。
--configure-<name> <value> 選擇性。設定在用戶端連線之前偵錯伺服器必須知道的偵錯屬性。這類屬性可以直接在啟動組態中使用,但必須以這種方式針對附加組態設定。例如,如果您不希望偵錯伺服器自動將自身注入到您要附加的程序所建立的子程序中,請使用 --configure-subProcess false

注意[<arg>] 可用於將命令列引數傳遞至要啟動的應用程式。

透過網路連線附加進行偵錯

本機腳本偵錯

在某些情況下,您可能需要偵錯由另一個程序在本機叫用的 Python 腳本。例如,您可能正在偵錯 Web 伺服器,該伺服器會針對特定的處理工作執行不同的 Python 腳本。在這種情況下,您需要在腳本啟動後,將 VS Code 偵錯工具附加至該腳本

  1. 執行 VS Code,開啟包含腳本的資料夾或工作區,並為該工作區建立 launch.json (如果尚未存在)。

  2. 在腳本程式碼中,新增下列程式碼並儲存檔案

    import debugpy
    
    # 5678 is the default attach port in the VS Code debug configurations. Unless a host and port are specified, host defaults to 127.0.0.1
    debugpy.listen(5678)
    print("Waiting for debugger attach")
    debugpy.wait_for_client()
    debugpy.breakpoint()
    print('break on this line')
    
  3. 使用 [終端機:建立新的終端機] 開啟終端機,這會啟動腳本的選取環境。

  4. 在終端機中,安裝 debugpy 套件

  5. 在終端機中,使用腳本啟動 Python,例如 python3 myscript.py。您應該會看到程式碼中包含的「Waiting for debugger attach」(正在等待偵錯工具附加) 訊息,且腳本會在 debugpy.wait_for_client() 呼叫處停止。

  6. 切換至 [執行和偵錯] 檢視 (⇧⌘D (Windows、Linux Ctrl+Shift+D)),從偵錯工具下拉式清單中選取適當的組態,然後啟動偵錯工具。

  7. 偵錯工具應該會在 debugpy.breakpoint() 呼叫處停止,從此處您可以正常使用偵錯工具。您也可以選擇使用 UI 在腳本程式碼中設定其他中斷點,而不是使用 debugpy.breakpoint()

使用 SSH 進行遠端腳本偵錯

遠端偵錯可讓您在 VS Code 中逐步執行本機程式,同時程式會在遠端電腦上執行。不需要在遠端電腦上安裝 VS Code。為了提高安全性,您可能想要或需要使用安全連線 (例如 SSH) 連線到遠端電腦進行偵錯。

注意:在 Windows 電腦上,您可能需要安裝 Windows 10 OpenSSH 才能使用 ssh 命令。

下列步驟概述設定 SSH 通道的一般程序。SSH 通道可讓您在本機電腦上工作,就像您直接在遠端電腦上工作一樣,而且比公開開啟連接埠更安全。

在遠端電腦上

  1. 啟用連接埠轉送,方法是開啟 sshd_config 組態檔 (在 Linux 上位於 /etc/ssh/ 下,在 Windows 上位於 %programfiles(x86)%/openssh/etc 下),並新增或修改下列設定

    AllowTcpForwarding yes
    

    注意:AllowTcpForwarding 的預設值為 yes,因此您可能不需要進行變更。

  2. 如果您必須新增或修改 AllowTcpForwarding,請重新啟動 SSH 伺服器。在 Linux/macOS 上,執行 sudo service ssh restart;在 Windows 上,執行 services.msc,在服務清單中選取 OpenSSH 或 sshd,然後選取 [重新啟動]。

在本機電腦上

  1. 執行 ssh -2 -L sourceport:localhost:destinationport -i identityfile user@remoteaddress 來建立 SSH 通道,為 destinationport 使用選取的連接埠,並在 user@remoteaddress 中使用適當的使用者名稱和遠端電腦的 IP 位址。例如,若要在 IP 位址 1.2.3.4 上使用連接埠 5678,命令會是 ssh -2 -L 5678:localhost:5678 -i identityfile user@1.2.3.4。您可以使用 -i 旗標指定身分識別檔案的路徑。

  2. 確認您可以在 SSH 工作階段中看到提示。

  3. 在您的 VS Code 工作區中,在 launch.json 檔案中建立遠端偵錯的組態,將連接埠設定為符合 ssh 命令中使用的連接埠,並將主機設定為 localhost。您在這裡使用 localhost,因為您已設定 SSH 通道。

    {
      "name": "Python Debugger: Attach",
      "type": "debugpy",
      "request": "attach",
      "port": 5678,
      "host": "localhost",
      "pathMappings": [
        {
          "localRoot": "${workspaceFolder}", // Maps C:\Users\user1\project1
          "remoteRoot": "." // To current working directory ~/project1
        }
      ]
    }
    

開始偵錯

現在已設定與遠端電腦的 SSH 通道,您可以開始偵錯。

  1. 兩部電腦:確定相同的原始程式碼可用。

  2. 兩部電腦:安裝 debugpy

  3. 遠端電腦:有兩種方式可以指定如何附加至遠端程序。

    1. 在原始程式碼中,新增下列程式碼行,將 address 取代為遠端電腦的 IP 位址和連接埠號碼 (此處顯示 IP 位址 1.2.3.4 僅供說明)。

      import debugpy
      
      # Allow other computers to attach to debugpy at this IP address and port.
      debugpy.listen(('1.2.3.4', 5678))
      
      # Pause the program until a remote debugger is attached
      debugpy.wait_for_client()
      

      listen 中使用的 IP 位址應該是遠端電腦的私人 IP 位址。接著,您可以正常啟動程式,使其暫停直到偵錯工具附加。

    2. 透過 debugpy 啟動遠端程序,例如

      python3 -m debugpy --listen 1.2.3.4:5678 --wait-for-client -m myproject
      

      這會使用 python3 啟動套件 myproject,並使用遠端電腦的私人 IP 位址 1.2.3.4,且在連接埠 5678 上接聽 (您也可以透過指定檔案路徑而非使用 -m 來啟動遠端 Python 程序,例如 ./hello.py)。

  4. 本機電腦:只有在您如上所述修改遠端電腦上的原始程式碼時,才在原始程式碼中新增遠端電腦上新增的相同程式碼的註解掉複本。新增這些程式碼行可確保兩部電腦上的原始程式碼逐行相符。

    #import debugpy
    
    # Allow other computers to attach to debugpy at this IP address and port.
    #debugpy.listen(('1.2.3.4', 5678))
    
    # Pause the program until a remote debugger is attached
    #debugpy.wait_for_client()
    
  5. 本機電腦:切換至 VS Code 中的 [執行和偵錯] 檢視 (⇧⌘D (Windows、Linux Ctrl+Shift+D)),選取 [Python 偵錯工具:附加] 組態

  6. 本機電腦:在您要開始偵錯的程式碼中設定中斷點。

  7. 本機電腦:使用修改後的 [Python 偵錯工具:附加] 組態和 [開始偵錯] 按鈕啟動 VS Code 偵錯工具。VS Code 應該會在您在本機設定的中斷點上停止,讓您可以逐步執行程式碼、檢查變數,以及執行所有其他偵錯動作。您在 [偵錯主控台] 中輸入的運算式也會在遠端電腦上執行。

    stdout 的文字輸出 (例如來自 print 陳述式) 會同時顯示在兩部電腦上。但是,其他輸出 (例如來自 matplotlib 等套件的圖形繪圖) 只會顯示在遠端電腦上。

  8. 在遠端偵錯期間,偵錯工具列會如下所示

    Debugging toolbar during remote debugging

    在此工具列上,中斷連線按鈕 (⇧F5 (Windows、Linux Shift+F5)) 會停止偵錯工具,並允許遠端程式執行完成。重新啟動按鈕 (⇧⌘F5 (Windows、Linux Ctrl+Shift+F5)) 會在本機電腦上重新啟動偵錯工具,但不會重新啟動遠端程式。只有在您已重新啟動遠端程式且需要重新附加偵錯工具時,才使用重新啟動按鈕。

設定組態選項

當您第一次建立 launch.json 時,有兩個標準組態會在編輯器中的作用中檔案中執行,無論是在整合式終端機 (在 VS Code 內部) 或外部終端機 (在 VS Code 外部)

{
  "configurations": [
    {
      "name": "Python Debugger: Current File (Integrated Terminal)",
      "type": "debugpy",
      "request": "launch",
      "program": "${file}",
      "console": "integratedTerminal"
    },
    {
      "name": "Python Debugger: Current File (External Terminal)",
      "type": "debugpy",
      "request": "launch",
      "program": "${file}",
      "console": "externalTerminal"
    }
  ]
}

特定設定會在下列章節中說明。您也可以新增其他設定 (例如 args),這些設定未包含在標準組態中。

提示:在專案中,建立執行特定啟動檔案的組態通常很有幫助。例如,如果您想要在啟動偵錯工具時,一律使用引數 --port 1593 啟動 startup.py,請建立如下所示的組態項目

 {
     "name": "Python Debugger: startup.py",
     "type": "debugpy",
     "request": "launch",
     "program": "${workspaceFolder}/startup.py",
     "args" : ["--port", "1593"]
 },

name

提供偵錯組態的名稱,該名稱會顯示在 VS Code 下拉式清單中。

type

識別要使用的偵錯工具類型;將此設定保留為 debugpy 以偵錯 Python 程式碼。

request

指定啟動偵錯的模式

  • launch:在 program 中指定的檔案上啟動偵錯工具
  • attach:將偵錯工具附加至已在執行的程序。如需範例,請參閱遠端偵錯

program

提供 Python 程式的進入模組 (啟動檔案) 的完整路徑。值 ${file} (通常用於預設組態) 會使用編輯器中目前的作用中檔案。藉由指定特定的啟動檔案,您可以一律確定以相同的進入點啟動程式,而與開啟的檔案無關。例如

"program": "/Users/Me/Projects/MyProject/src/event_handlers/__init__.py",

您也可以依賴工作區根目錄的相對路徑。例如,如果根目錄是 /Users/Me/Projects/MyProject,則您可以使用下列範例

"program": "${workspaceFolder}/src/event_handlers/__init__.py",

module

提供指定要偵錯的模組名稱的功能,類似於在命令列執行時的 -m 引數。如需詳細資訊,請參閱 Python.org

python

指向要用於偵錯的 Python 解譯器的完整路徑。

如果未指定,此設定預設為為您的工作區選取的解譯器,這相當於使用值 ${command:python.interpreterPath}。若要使用不同的解譯器,請改為在偵錯組態的 python 屬性中指定其路徑。

或者,您可以使用在每個平台上定義的自訂環境變數,以包含要使用的 Python 解譯器的完整路徑,如此一來就不需要其他資料夾路徑。

如果您需要將引數傳遞至 Python 解譯器,您可以使用 pythonArgs 屬性。

pythonArgs

使用語法 "pythonArgs": ["<arg 1>", "<arg 2>",...] 指定要傳遞至 Python 解譯器的引數。

args

指定要傳遞至 Python 程式的引數。引數字串中以空格分隔的每個元素都應該包含在引號內,例如

"args": ["--quiet", "--norepeat", "--port", "1593"],

如果您想要為每個偵錯執行提供不同的引數,您可以將 args 設定為 "${command:pickArgs}"。這會在每次啟動偵錯工作階段時提示您輸入引數。

注意"${command:pickArgs}"["${command:pickArgs}"] 的剖析方式有所不同,特別要注意 [] 的用法。作為陣列,所有引數都會以單一字串傳遞,如果沒有括號,則每個引數都會以自己的字串傳遞。

stopOnEntry

設定為 true 時,會在偵錯程式的第一行中斷偵錯工具。如果省略 (預設) 或設定為 false,偵錯工具會將程式執行到第一個中斷點。

console

指定程式輸出在 redirectOutput 的預設值未修改的情況下如何顯示。

顯示輸出的位置
"internalConsole" VS Code 偵錯主控台。 如果 redirectOutput 設定為 False,則不會顯示任何輸出。
"integratedTerminal" (預設) VS Code 整合式終端機。如果 redirectOutput 設定為 True,輸出也會顯示在偵錯主控台中。
"externalTerminal" 個別主控台視窗。如果 redirectOutput 設定為 True,輸出也會顯示在偵錯主控台中。

purpose

使用 purpose 選項,有多種方式可以設定 [執行] 按鈕。將選項設定為 debug-test,定義組態應該在 VS Code 中偵錯測試時使用。但是,將選項設定為 debug-in-terminal,定義組態只應該在存取編輯器右上角的 [執行 Python 檔案] 按鈕時使用 (無論按鈕提供的選項是 [執行 Python 檔案] 或 [偵錯 Python 檔案])。注意purpose 選項不能用於透過 F5 或 [執行 > 開始偵錯] 啟動偵錯工具。

autoReload

允許在偵錯工具執行命中中斷點後,對程式碼進行變更時自動重新載入偵錯工具。若要啟用此功能,請將 {"enable": true} 設定為如下列程式碼所示。

{
  "name": "Python Debugger: Current File",
  "type": "debugpy",
  "request": "launch",
  "program": "${file}",
  "console": "integratedTerminal",
  "autoReload": {
    "enable": true
  }
}

注意:當偵錯工具執行重新載入時,在匯入時執行的程式碼可能會再次執行。若要避免這種情況,請嘗試僅在您的模組中使用匯入、常數和定義,將所有程式碼放入函式中。或者,您也可以使用 if __name__=="__main__" 檢查。

subProcess

指定是否啟用子程序偵錯。預設為 false,設定為 true 以啟用。如需詳細資訊,請參閱多目標偵錯

cwd

指定偵錯工具的目前工作目錄,這是程式碼中使用的任何相對路徑的基礎資料夾。如果省略,則預設為 ${workspaceFolder} (在 VS Code 中開啟的資料夾)。

例如,假設 ${workspaceFolder} 包含一個包含 app.pypy_code 資料夾,以及一個包含 salaries.csvdata 資料夾。如果您在 py_code/app.py 上啟動偵錯工具,則資料檔案的相對路徑會根據 cwd 的值而有所不同

cwd 資料檔案的相對路徑
已省略或 ${workspaceFolder} data/salaries.csv
${workspaceFolder}/py_code ../data/salaries.csv
${workspaceFolder}/data salaries.csv

redirectOutput

當設定為 true (internalConsole 的預設值) 時,會讓偵錯工具將程式的所有輸出列印到 VS Code 偵錯輸出視窗中。如果設定為 false (integratedTerminal 和 externalTerminal 的預設值),則程式輸出不會顯示在偵錯工具輸出視窗中。

當使用 "console": "integratedTerminal""console": "externalTerminal" 時,通常會停用此選項,因為不需要在偵錯主控台中重複輸出。

justMyCode

當省略或設定為 true (預設值) 時,偵錯會限制為僅限使用者撰寫的程式碼。設定為 false 也會啟用標準程式庫函式的偵錯。

django

當設定為 true 時,會啟用特定於 Django Web 架構的偵錯功能。

sudo

當設定為 true 並與 "console": "externalTerminal" 一起使用時,允許偵錯需要提升權限的應用程式。使用外部主控台是擷取密碼的必要條件。

pyramid

當設定為 true 時,確保 Pyramid 應用程式使用 必要的 pserve 命令啟動。

env

為偵錯工具程序設定除了系統環境變數之外的可選環境變數,偵錯工具始終會繼承系統環境變數。這些變數的值必須以字串形式輸入。

envFile

包含環境變數定義的檔案的可選路徑。請參閱設定 Python 環境 - 環境變數定義檔案

gevent

如果設定為 true,則啟用 gevent monkey-patched 程式碼的偵錯。

jinja

當設定為 true 時,會啟用特定於 Jinja 範本框架的偵錯功能。

中斷點和記錄點

Python 偵錯工具擴充功能支援用於偵錯程式碼的中斷點記錄點。如需基本偵錯和使用中斷點的簡短逐步解說,請參閱教學課程 - 設定和執行偵錯工具

條件中斷點

中斷點也可以設定為根據運算式、命中計數或兩者的組合觸發。Python 偵錯工具擴充功能除了以 ==、>、>=、<、<= 和 % 運算子為前導的整數之外,還支援整數的命中計數。例如,您可以設定命中計數 >5,將中斷點設定為在發生五次之後觸發。如需更多資訊,請參閱主要 VS Code 偵錯文章中的條件中斷點

在程式碼中叫用中斷點

在您的 Python 程式碼中,您可以在您想要在偵錯階段作業期間暫停偵錯工具的任何點呼叫 debugpy.breakpoint()

中斷點驗證

Python 偵錯工具擴充功能會自動偵測設定在不可執行行上的中斷點,例如 pass 陳述式或多行陳述式的中間。在這種情況下,執行偵錯工具會將中斷點移動到最近的有效行,以確保程式碼執行在該點停止。

偵錯特定應用程式類型

組態下拉式選單為一般應用程式類型提供各種不同的選項

組態 描述
附加 請參閱前一節中的遠端偵錯
Django 指定 "program": "${workspaceFolder}/manage.py""args": ["runserver"]。也會新增 "django": true 以啟用 Django HTML 範本的偵錯。
Flask 請參閱下方的Flask 偵錯
Gevent "gevent": true 新增至標準整合式終端機組態。
Pyramid 移除 program,新增 "args": ["${workspaceFolder}/development.ini"],新增 "jinja": true 以啟用範本偵錯,並新增 "pyramid": true 以確保程式使用必要的 pserve 命令啟動。

遠端偵錯和 Google App Engine 也需要特定的步驟。如需偵錯測試的詳細資訊,請參閱測試

若要偵錯需要系統管理員權限的應用程式,請使用 "console": "externalTerminal""sudo": "True"

Flask 偵錯

{
    "name": "Python Debugger: Flask",
    "type": "debugpy",
    "request": "launch",
    "module": "flask",
    "env": {
        "FLASK_APP": "app.py"
    },
    "args": [
        "run",
        "--no-debugger"
    ],
    "jinja": true
},

如您所見,此組態指定 "env": {"FLASK_APP": "app.py"}"args": ["run", "--no-debugger"]"module": "flask" 屬性會取代 program 使用。(您可能會在 env 屬性中看到 "FLASK_APP": "${workspaceFolder}/app.py",在這種情況下,請修改組態以僅參考檔案名稱。否則,您可能會看到「無法匯入模組 C」錯誤,其中 C 是磁碟機代號。)

"jinja": true 設定也會啟用 Flask 預設 Jinja 範本引擎的偵錯。

如果您想要在開發模式下執行 Flask 的開發伺服器,請使用下列組態

{
    "name": "Python Debugger: Flask (development mode)",
    "type": "debugpy",
    "request": "launch",
    "module": "flask",
    "env": {
        "FLASK_APP": "app.py",
        "FLASK_ENV": "development"
    },
    "args": [
        "run"
    ],
    "jinja": true
},

疑難排解

偵錯工具可能無法運作的原因有很多。有時偵錯主控台會顯示特定原因,但主要原因如下

  • 請確保已在 VS Code 中安裝並啟用Python 偵錯工具擴充功能,方法是開啟 擴充功能 檢視 (⇧⌘X (Windows、Linux Ctrl+Shift+X)) 並搜尋 @installed python debugger

  • Python 可執行檔的路徑不正確:檢查您選取的解譯器的路徑,方法是執行 Python: 選取解譯器 命令並查看目前的值

    Troubleshooting wrong Python interpreter when debugging

  • 您的 launch.json 檔案中 "type" 設定為已棄用的值 "python":請將 "python" 替換為 "debugpy",以便與 Python 偵錯工具擴充功能搭配使用。

  • 監看式視窗中有無效的運算式:清除監看式視窗中的所有運算式,然後重新啟動偵錯工具。

  • 如果您正在使用使用原生執行緒 API (例如 Win32 CreateThread 函式,而非 Python threading API) 的多執行緒應用程式,目前有必要在您想要偵錯的任何檔案頂端包含下列原始碼

    import debugpy
    debugpy.debug_this_thread()
    
  • 如果您正在使用 Linux 系統,當嘗試將偵錯工具套用至任何執行中的程序時,您可能會收到「逾時」錯誤訊息。為了防止這種情況,您可以暫時執行下列命令

    echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
    

後續步驟

  • Python 環境 - 控制用於編輯和偵錯的 Python 解譯器。
  • 測試 - 設定測試環境並探索、執行和偵錯測試。
  • 設定參考 - 探索 VS Code 中與 Python 相關的完整設定範圍。
  • 一般偵錯 - 了解 VS Code 的偵錯功能。