在使用VSCode进行Python编程的时候,有的时候会需要在debug模式下设断点来实时查看程序运行情况。比起直接的print大法,debug模式下有很多方便的地方:
- 启动方便。点一下绿色小三角or一个快捷键就可以完成启动,免得切命令行窗口去run。
- 实时断点。运行的时候可以随时添加or删除断点。
- 实时交互式编程。设置好了断点之后可以用python下的交互式编程去查看一些变量,或是试运行一些代码。
- 查看变量与运行栈。
- ……
更多debug模式下可以做的事情可以参考官方文档:
[1] "Debugging,", https://code.visualstudio.com/docs/editor/debugging
一般来讲在安装好python扩展之后,右上角就会有一个run的按钮。但这个run只能运行当前打开的文件,即当你点击之后它会自动开启一个terminal,并且运行如下代码:
python ${file}
但很多情况下这种方式并不能满足我们的需要。例如,我们往往并不会运行当前打开的文件,而是一个固定的入口文件(如main.py
);并且常常会有一些命令行参数,甚至需要设置好几组不同的参数来交错运行。
因此我们需要VSCode自带的Run & Debug模式,并使用launch.json
文件来更加细致的设置具体的运行环境。
前置:Python扩展的版本问题
当前时间下(本文写于2022年10月16日),Python扩展的最新版本对VSCode本身的debug模式有一些不支持,会导致点击运行之后闪退没有任何的输出。需要手动改成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的设置与使用
首先创建一个launch.json文件。
- 点击左侧的“Run & Debug”菜单栏,点击“create a launch.json file”。
- 会让你选择具体的语言。选择Python,选择运行当前文件即可。
创建的launch.json文件会存在.vscode
文件夹下。设置好之后,相应的Configuration就会出现在“Run & Debug”栏目下,可以直接进行相应的debug流程了。
使用json格式来设置相应的字段。具体可以参考官方文档:
[3] "Python debugging in VS Code," https://code.visualstudio.com/docs/python/debugging
下面是一些常见字段的说明:
-
name
:用于标识,随便起。会显示在下拉菜单中。 -
program
:相当于指示一个入口文件。常见的操作可能是给一个${workspaceFolder}/main.py
,即你的工作根目录下的main.py
文件。 -
module
:与上面的相似,不过会用-m
参数来运行module。 -
python
:指向你的Python interpreter。可以以此来区分不同的anaconda环境;也可以不设置,在外部设置相应的interpreter。 -
args
:传入的命令行参数,是一个list。 -
console
:程序会运行在哪个terminal里面。默认的就很好用。 -
justMyCode
:建议设为false
,允许跳至外部代码。 -
env
:一些环境参数。例如在训练时指定相应的显卡序号。
给一个我自己的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",
},
},
]
}