0%

vscode中调试python程序:launch.json文件

当我们使用vscode登录远程服务器时,总会遇到一个问题,python程序难以像Pycharm那样方便地进行调试,只能使用print大法查看中间变量值。但其实vscode已经提供了调试python程序的方法,那就是launch.json文件。

打开vscode,在上方菜单栏中选择“运行 - 添加配置”,就能够打开launch.json文件,设置调试参数,如下方格式所示。version代表json文件的版本号,不需要理会;configurations代表具体的调试配置项。

1
2
3
4
5
6
7
8
9
10
11
{
"version": "0.2.0",
configurations: [
{
// something
},
{
// something
}
]
}

下面来看看具体的调试配置项如何编写。

1
2
# 运行程序时使用的命令行
CUDA_VISIBLE_DEVICES=0,1,2,3 python example.py --config example_config.txt --dir example_dir --data example_data.csv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 对应的配置项
{
// 这个配置项的名称,用于辨识,对调试过程无影响
"name": "someName",
// 配置类型,因为需要调试python程序,所以固定设置为"python"
"type": "python",
// 参数可选"launch"和"attach",默认"launch"即可
"request": "launch",
// python需要启动的程序,例如"/home/someone/example.py",注意需要使用完整的绝对路径
"program": "/home/someone/example.py",
// 参数可选"integratedTerminal"、"internalTerminal"和"externalTerminal",默认选择"intergratedTerminal"即可
// integratedTerminal: 输出内容会在vscode底部的“终端”中显示
// internalTerminal: 输出内容会在vscode底部的“调试控制台”中显示
// externalTerminal: vscode会弹出cmd窗口,输出内容在窗口中显示
"console": "integratedTerminal",
// 选择哪个环境下的python来启动程序,注意需要使用完整的绝对路径,不添加此项则使用默认python环境
"python": "/home/someone/anaconda3/envs/someEnv/bin/python",
// 是否仅调试自己的代码(而不调试库文件)
"justMyCode": true,
// 调试时携带的命令行参数,将命令行参数按照空格拆分开放入列表中即可,注意所有的文件名和文件夹名都需要使用完整的绝对路径
"args": [
"--config",
"/home/someone/example_config.txt",
"--dir",
"/home/someone/example_dir",
"--data",
"/home/someone/example_data.csv"
],
// 调试时需要携带的环境变量信息
"env": {
"CUDA_VISIBLE_DEVICES": "0,1,2,3"
}
}

还需要注意的是,在调试环境下,所有的文件名和文件夹名都需要使用完整的绝对路径,否则将会报错:文件/文件夹未找到/无法打开。

当需要运行分布式程序时,可能会使用到形如下述命令行。

1
python -m torch.distributed.launch --nproc_per_node 8 train.py

这时需要将program项更换为torch/distributed/launch.py的绝对路径,不需要python项,如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"name": "someName",
"type": "python",
"request": "launch",
"program": "/home/someone/anaconda3/envs/someEnv/lib/python3.7/site-packages/torch/distributed/launch.py",
"console": "integratedTerminal",
"justMyCode": true,
"args": [
"--nproc_per_node",
"8",
"train.py"
]
}