用VScode代碼調試Python
Python擴展支持許多類型的Python應用程序的調試,包括以下一般功能:
- 觀看窗口
- 評估表達式
- 當地人
- 參數
- 擴大孩子
- 斷點
- 條件斷點
- 暫停(進入)正在運行的程序
- 自定義啟動目錄
要熟悉這些常規功能,請查看VS Code調試文章。本文僅討論那些特定於Python的註意事項。
選擇一個配置
要選擇調試配置,請選擇邊欄中的調試視圖,然後從下拉列表中選擇一個選項:
在調試時,狀態欄顯示左下角的當前配置,當前的調試解釋器位於右側。選擇配置會顯示列表,您可以從中選擇不同的配置:
默認情況下,調試器使用與python.pythonPath
VS Code其他功能相同的設置。要使用不同的解釋器,請pythonPath
在調試器設置中設置該值。或者,在狀態欄上選擇指定的解釋器以選擇不同的解釋器。
註:調試器設置不支持相對路徑,包括依賴主
python.pythonPath
設置時。要解決此問題,請使用環境變量,或者創建一個變量,例如${workspaceFolder}
解析到您的項目文件夾,然後在該路徑中使用該變量,如in"python.pythonPath": "${workspaceFolder}/venv/bin/python"
。
要查看所有配置,請launch.json
通過選擇配置下拉列表旁邊的齒輪圖標打開:
下一節將介紹默認或標準的“Python:當前文件”配置。本文還介紹了調試特定應用程序類型下的其他配置
註意:如果您想嘗試新的實驗性調試器,請參閱Issue 538(GitHub)上的說明。
標準配置和選項
標準配置為launch.json
:
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
}
以下各節介紹各種設置的自定義配置。
name
提供出現在VS Code下拉列表中的調試配置的名稱。
type
標識要使用的調試器的類型; 將此設置留給python
Python代碼。
request
指定開始調試的模式:
launch
program
attach
:將調試器附加到已經運行的進程。有關示例,請參閱遠程調試。
program
提供python程序入口模塊的完全限定路徑。推薦值為${file}
,它使用編輯器中的活動文件。但是,對於具有多個文件的程序,您可以指定程序的啟動文件。例如:
"program": "/Users/Me/Projects/PokemonGo-Bot/pokemongo_bot/event_handlers/__init__.py",
您還可以依賴工作區根目錄中的相對路徑。例如,如果根是/Users/Me/Projects/PokemonGo-Bot
那麽你可以使用以下內容:
"program": "${workspaceFolder}/pokemongo_bot/event_handlers/__init__.py",
pythonPath
指向Python解釋器用於調試目的。如果未指定,則默認為python.pythonPath
設置中標識的解釋器,這相當於使用該值${config:python.pythonPath}
。要使用不同的解釋器,請改為指定其路徑。
您可以通過將指定特定於平臺的路徑pythonPath
命名的父對象中osx
,windows
或者linux
。例如,PySpark的配置使用以下值:
"osx": {
"pythonPath": "^\"\\${env:SPARK_HOME}/bin/spark-submit\""
},
"windows": {
"pythonPath": "^\"\\${env:SPARK_HOME}/bin/spark-submit.cmd\""
},
"linux": {
"pythonPath": "^\"\\${env:SPARK_HOME}/bin/spark-submit\""
},
args
指定傳遞給Python程序的參數,例如:
"args": [
"--quiet", "--norepeat"
],
stopOnEntry
設置為true時,在調試程序的第一行中斷開調試器。如果省略(默認)或設置為false,則調試器將程序運行到第一個斷點。
console
指定如何顯示程序輸出。
值 | 顯示輸出的地方 |
---|---|
"none" |
VS代碼調試控制臺 |
"integratedTerminal" (默認) |
VS代碼集成終端 |
"externalTerminal" |
獨立控制臺窗口 |
cwd
指定調試器的當前工作目錄,它是代碼中使用的任何相對路徑的基礎文件夾。如果省略,默認為${workspaceFolder}
(在VS代碼中打開的文件夾)。
作為一個例子,說${workspaceFolder}
包含一個py_code
文件夾包含app.py
,和一個data
文件夾包含salaries.csv
。如果啟動調試器py_code/app.py
,則數據文件的相對路徑根據以下值而變化cwd
:
CWD | 數據文件的相對路徑 |
---|---|
省略或 ${workspaceFolder} |
data/salaries.csv |
${workspaceFolder}/py_code ) |
../data/salaries.csv |
${workspaceFolder}/data |
salaries.csv |
debugOptions
一系列可能包含以下內容的附加選項:
選項 | 描述 |
---|---|
"RedirectOutput" (默認) |
使調試器將程序的所有輸出打印到VS Code調試輸出窗口中。如果省略此設置,則所有程序輸出不顯示在調試器輸出窗口中。該選項在使用時通常會被省略,"console": "integratedTerminal" 或者"console": "externalTerminal" 因為不需要在調試控制臺中復制輸出。 |
"DebugStdLib" |
啟用標準庫函數的調試。 |
"Django" |
激活特定於Django Web框架的調試功能。 |
"Sudo" |
與...一起使用時"console": "externalTerminal" ,允許調試需要提升的應用程序。捕獲密碼需要使用外部控制臺。 |
"Pyramid" |
在調試金字塔應用程序時使用。 |
env
為除調試器始終繼承的系統環境變量之外的調試器進程設置可選的環境變量。
envFile
包含環境變量定義的文件的可選路徑。請參閱配置Python環境 - 環境變量定義文件。
調試特定的應用程序類型
配置下拉菜單為常規應用程序類型提供了各種不同的選項:
組態 | 描述 |
---|---|
PySpark | 使用PySpark而不是默認解釋器運行程序,使用pythonPath 前面在pythonPath選項下顯示的特定於平臺的值。 |
Python模塊 | 替換program 設置"module": "module.name" 以調試特定模塊。使用此配置時,請將該值替換為所需的模塊名稱。 |
集成終端/控制臺 | 將"console": "integratedTerminal" 選項添加到標準配置。 |
外部終端/控制臺 | 將"console": "externalTerminal" 選項添加到標準配置。 |
Django的 | 指定"program": "${workspaceFolder}/manage.py" 並"args": ["runserver", "--noreload", "--nothreading"] 添加“Django”和“RedirectOutput” debugOptions 。請註意,在調試時不能自動重新加載Django應用程序。要調試Django HTML模板,請添加斷點templates 。 |
燒瓶 | 請參閱下面的Flask調試。 |
金字塔 | 刪除program ,添加"args": ["${workspaceFolder}/development.ini"] 並添加“金字塔”和“重定向輸出” debugOptions 。 |
沃森 | 指定"program": "${workspaceFolder}/console.py" 和"args": ["dev", "runserver", "--noreload=True"] |
Scrapy | 指定"program": "~/.virtualenvs/scrapy/bin/scrapy" ,添加"console": "integratedTerminal" 選項並添加"args": ["crawl", "specs", "-o", "bikes.json"] 。 |
附加(遠程調試) | 請參閱以下遠程調試。 |
遠程調試和Google App Engine還需要具體步驟。有關調試單元測試(包括nosetest)的詳細信息,請參閱單元測試。
要調試需要管理員權限的應用程序,請在中使用"console": "externalTerminal"
並包含“Sudo” debugOptions
。
燒瓶調試
{
"name": "Flask",
"type": "python",
"request": "launch",
"stopOnEntry": false,
"pythonPath": "${config:python.pythonPath}",
"module": "flask",
"cwd": "${workspaceFolder}",
"env": {
"FLASK_APP": "${workspaceFolder}/app.py"
},
"args": [
"run",
"--no-debugger",
"--no-reload"
]
},
正如你所看到的,這個配置指定"stopOnEntry": false
,"env": {"FLASK_APP": "${workspaceFolder}/app.py"}
和"args": ["run", "--no-debugger","--no-reload"]
。該"module": "flask"
屬性被用來代替program
。
遠程調試
遠程調試允許您在VS代碼本地執行一個程序,同時在遠程計算機上執行它。在這種情況下,必須在兩臺計算機上都有源代碼。
-
在開發和遠程計算機上,安裝ptvsd 3.0.0(
3.0.0
完全版本- 更高版本尚不支持#514)。 -
在兩臺計算機的源代碼中,添加以下行,用適當的密碼替換my_secret以驗證遠程調試,並用合適的IP地址(或)和端口號替換地址
localhost
:import ptvsd ptvsd.enable_attach("my_secret", address = (‘0.0.0.0‘, 3000)) # Enable the line of source code below only if you want the application to wait until the debugger has attached to it #ptvsd.wait_for_attach()
-
僅在遠程計算機上,取消註釋上面的最後一行。您希望在開發機器上保留註釋行,以確保兩臺機器上的源代碼與行符合。
-
啟動遠程程序。
-
選擇附加(遠程調試)(下面)配置,然後修改
remoteRoot
為指向該程序的遠程計算機上的位置,並修改host
,port
以及secret
在上面添加的源代碼中的值匹配。{ "name": "Attach (Remote Debug)", "type": "python", "request": "attach", "localRoot": "${workspaceFolder}", "remoteRoot": "${workspaceFolder}", "port": 3000, "secret": "my_secret", "host": "localhost" }
通過SSH進行調試
視窗:
- 使用sshd_config或類似命令在遠程計算機上啟用ssh端口轉發。
- 建立一個PuTTY SSH隧道:
- 閱讀使用PuTTY設置SSH隧道(直到“打開會話”部分)。
- 在“隧道”屏幕上,使用本地模式,源端口(本地計算機上的入口點端口)可能與目標端口(服務器上的端點)不同。
- 目標地址應該是本地主機或
127.0.0.1
地址(這是遠程SSH服務器用於建立隧道的地址)。
Linux的:
- 跑
ssh -L sourceport:localhost:destinationport user@remoteaddress
接下來,驗證您可以在SSH會話中看到提示。然後打開VS Code並將端口配置為顯示在Tunnels屏幕上的調試端口。
最後,啟動程序並按照上一節所述附加調試器。
Google App Engine調試
Google App Engine自己啟動一個應用程序,因此在VS Code調試器中啟動它不是直接可能的。相反,我們需要在應用中使用ptvsd,然後以允許VS Code附加其調試器的模式啟動Google App Engine。
-
下載ptvsd並將其文件解壓縮到工作文件夾中的ptvsd文件夾中。(如果使用不同的文件夾,請修改
pydev_startup.py
步驟4中創建的文件中的路徑)。 -
tasks.json
使用以下內容創建一個文件:{ "version": "2.0.0", "tasks": [ { "label": "Launch Google App Engine", "command": "python", "type": "shell", "args": [ "/usr/local/google_appengine/dev_appserver.py", "--python_startup_script=${workspaceFolder}/pydev_startup.py", "--automatic_restart=no", "--max_module_instances=default:1", "${workspaceFolder}/app.yaml" ] } ] }
-
在Windows和Linux上,將第一項內容替換
args
為安裝Google App Engine的路徑(上面的源代碼中顯示的路徑適用於MacOS)。 -
在您的項目根目錄下創建一個名為pydev_startup.py的文件,其中包含以下內容,並按照說明修改:
import sys import os #Assuming that pdvsd is located in the working folder sys.path.append(os.getcwd()) import ptvsd # Modify the secret and port number as desired; you‘re debugging locally so the values don‘t matter. # However, be sure the port is not blocked on your computer. ptvsd.enable_attach(secret = ‘gae‘, address = (‘0.0.0.0‘, 3000)) #The debug server has started and you can now use VS Code to attach to the application for debugging print("Google App Engine has started, ready to attach the debugger")
-
launch.json
使用Attach(遠程調試)配置作為模板創建配置。確保秘密和端口值與上面源代碼中的內容匹配。 -
添加
"preLaunchTask": "python"
到launch.json
。 -
從命令面板中,運行“ 運行構建任務”命令。這將打開任務輸出窗口,您可以在其中看到各種消息。
-
一旦看到消息“Google App Engine已啟動,準備好連接調試器”,請使用遠程調試配置啟動VS Code調試器。
-
在需要的地方設置斷點,然後啟動瀏覽器以啟動應用程序。
故障排除
調試器可能無法正常工作的原因很多。調試控制臺經常會顯示具體原因,但有兩個具體原因如下:
-
python可執行文件的路徑不正確:請檢查
pythonPath
用戶設置中的值。 -
觀察窗口中的表達式無效(請參閱下面的示例):清除Watch窗口中的所有表達式並重新啟動調試器。
Traceback (most recent call last): File ".../visualstudio_py_debugger.py", line 1646, in loop cmd() File ".../visualstudio_py_debugger.py", line 1918, in command_execute_code thread.run_on_thread(text, cur_frame, eid, frame_kind, repr_kind) File ".../visualstudio_py_debugger.py", line 1246, in run_on_thread self.schedule_work(lambda : self.run_locally(text, cur_frame, execution_id, frame_kind, repr_kind)) File ".../visualstudio_py_debugger.py", line 1238, in schedule_work self.unblock() File ".../visualstudio_py_debugger.py", line 1234, in unblock self._block_lock.release() RuntimeError: release unlocked lock
下一步
- Python環境 - 控制哪個Python解釋器用於編輯和調試。
- 單元測試 - 配置單元測試環境並發現,運行和調試測試。
- 設置參考 - 探索VS Code中與Python相關的所有設置。
- 一般調試 - 了解VS Code的調試功能。
用VScode代碼調試Python