在使用VSCode進行Python編程的時候,有的時候會需要在debug模式下設(shè)斷點來實時查看程序運行情況。比起直接的print大法,debug模式下有很多方便的地方:
- 啟動方便。點一下綠色小三角or一個快捷鍵就可以完成啟動,免得切命令行窗口去run。
- 實時斷點。運行的時候可以隨時添加or刪除斷點。
- 實時交互式編程。設(shè)置好了斷點之后可以用python下的交互式編程去查看一些變量,或是試運行一些代碼。
- 查看變量與運行棧。
- ……
更多debug模式下可以做的事情可以參考官方文檔:
[1] "Debugging,", https://code.visualstudio.com/docs/editor/debugging
一般來講在安裝好python擴展之后,右上角就會有一個run的按鈕。但這個run只能運行當前打開的文件,即當你點擊之后它會自動開啟一個terminal,并且運行如下代碼:
python ${file}
但很多情況下這種方式并不能滿足我們的需要。例如,我們往往并不會運行當前打開的文件,而是一個固定的入口文件(如main.py);并且常常會有一些命令行參數(shù),甚至需要設(shè)置好幾組不同的參數(shù)來交錯運行。
因此我們需要VSCode自帶的Run & Debug模式,并使用launch.json文件來更加細致的設(shè)置具體的運行環(huán)境。
前置:Python擴展的版本問題
當前時間下(本文寫于2022年10月16日),Python擴展的最新版本對VSCode本身的debug模式有一些不支持,會導(dǎo)致點擊運行之后閃退沒有任何的輸出。需要手動改成v2021.12.1559732655。具體步驟如下:
- 進入到Python擴展的頁面下。
- 在“Uninstall”旁邊有一個小三角,點開后點擊“Install another version...”。
- 等一段時間后會讓你選擇版本,選擇
v2021.12.1559732655。 - 最好取消掉擴展的“Extensions: Auto Update”。可以使用
ctrl+shift+p打開Command Palette,運行Extensions: Disable Auto Update for all extensions。 - 重啟VSCode。
[2] "VS Code Debugger not working for python," https://learn.microsoft.com/en-us/answers/questions/724858/vscode-debugger-not-working-for-python.html
launch.json的設(shè)置與使用
首先創(chuàng)建一個launch.json文件。
- 點擊左側(cè)的“Run & Debug”菜單欄,點擊“create a launch.json file”。
- 會讓你選擇具體的語言。選擇Python,選擇運行當前文件即可。
創(chuàng)建的launch.json文件會存在.vscode文件夾下。設(shè)置好之后,相應(yīng)的Configuration就會出現(xiàn)在“Run & Debug”欄目下,可以直接進行相應(yīng)的debug流程了。
使用json格式來設(shè)置相應(yīng)的字段。具體可以參考官方文檔:
[3] "Python debugging in VS Code," https://code.visualstudio.com/docs/python/debugging
下面是一些常見字段的說明:
-
name:用于標識,隨便起。會顯示在下拉菜單中。 -
program:相當于指示一個入口文件。常見的操作可能是給一個${workspaceFolder}/main.py,即你的工作根目錄下的main.py文件。 -
module:與上面的相似,不過會用-m參數(shù)來運行module。 -
python:指向你的Python interpreter??梢砸源藖韰^(qū)分不同的anaconda環(huán)境;也可以不設(shè)置,在外部設(shè)置相應(yīng)的interpreter。 -
args:傳入的命令行參數(shù),是一個list。 -
console:程序會運行在哪個terminal里面。默認的就很好用。 -
justMyCode:建議設(shè)為false,允許跳至外部代碼。 -
env:一些環(huán)境參數(shù)。例如在訓(xùn)練時指定相應(yīng)的顯卡序號。
給一個我自己的launch.json文件配置:
{
"version": "0.2.0",
"configurations": [
{
"name": "main.py",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/main.py",
"console": "integratedTerminal",
"justMyCode": false,
"args": [
"--config", "param.ini",
],
"env": {
"CUDA_VISIBLE_DEVICES": "0",
},
},
]
}