python的Vscode调试

写在开头的废话

调试并不是一个困难的过程。对我本人而言,从最早学习C语言时使用的Visual Studio时便已经开始使用,只要会打断点、单步执行即可。后来转到Java,使用Idea时也没什么问题。

究其根本,是这两个的集成开发环境过于强大,许多东西都帮我免去配置的步骤了。

但是后来我开始学习深度学习,使用vscode来写python,情况发生了一些变化。我突然不会调试了。开始使用最传统的添加print语句来进行测试。再后来,同门师兄告诉我有pdb这个东西,可以拿来在命令行进行调试。但pdb也有其缺点,比如在代码中添加的pdb.set_trace()需要一个一个手动删除。

所以今天要详细记录一下如何在vscode中调试python。并讲一下也许是Timed out waiting for debuggee to spawn的解决方案。

首先从最简单的做法看起

在安装完插件后,vscode右上角会有运行的标志,如下图中心的图标。
请添加图片描述

点击下拉按钮可以看到更多的内容:
请添加图片描述

最简单的方法就是使用第三行“Python 调试程序: 调试Python文件”来对代码进行调试,这是最直接的方法,调试完之后会在断点停下,可以进行其他操作。甚至可以在下方的调试控制台执行实时的代码。

请添加图片描述

但假如我们对调试有更高的要求,比如说添加参数,那么这种简单的方法就不适用了。需要配置launch.json文件,这个文件可以很好的满足我们的需求。下面我们进入高级调试篇。

高级调试

基础

最初的launch.json,即自动生成的,长这样,它在工程目录的.vscode/目录下:

请添加图片描述

要添加参数只需在args中配置,比如说我要传一个str进去

请添加图片描述

那么这段代码就会直接输出“–str”

请添加图片描述

所以如果原始命令行形如:python [your_file.py] —arrg1 —arg2

那么只需修改上图中的args即可。

添加环境变量

如果更进一步,想要将环境变量,例如CUDA_VISIBLE_DEVICES=0传入,那么就需要新增env变量:

请添加图片描述

不必担心为什么命令行中没出现,因为这个东西似乎是自动配置到终端里了,可以用下面的代码进行验证:

请添加图片描述

python -m 或者说python -m torch.distributed.launch该怎么办

最后,假如遇到了类似Timed out waiting for debuggee to spawn的问题。那么很有可能是由于在调用python -m torch.distributed.launch导致的,上述配置方法不适用于运行python -m。如果想要调用的话,需要删除launch.json中的"program": “${file}”,随后添加"module":"torch.distributed.launch"并将要执行的文件放到args中。这样便可以解决问题,下面是示例代码:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python 调试程序: 包含参数的当前文件",
            "type": "debugpy",
            "request": "launch",
            "module":"torch.distributed.launch",
            // "program": "${file}",
            // "pythonArgs": [

            // ],
            "args": [
                // "-m", "torch.distributed.launch",
                "--nproc_per_node", "1",
                "--master_port", "1111",
                "train_dist_mod.py",
                "--num_decoder_layers", "6",
                "--use_color",
                "--weight_decay", "0.0005",
                "--data_root", "./data/",
                "--val_freq", "3",
                "--batch_size", "4",
                "--save_freq", "3",
                "--print_freq", "500",
                "--lr_backbone", "2e-3",
                "--lr", "2e-4",
                "--dataset", "scanrefer",
                "--test_dataset", "scanrefer",
                "--detect_intermediate",
                "--joint_det",
                "--use_soft_token_loss",
                "--use_contrastive_align",
                "--log_dir", "./output/logs/eda",
                "--lr_decay_epochs", "50", "75",
                "--pp_checkpoint", "./data/gf_detector_l6o256.pth",
                "--self_attend",
                "--augment_det"
            ],
            "env": {
                "TORCH_DISTRIBUTED_DEBUG": "INFO",
                "CUDA_VISIBLE_DEVICES": "0"
            },
            "console": "integratedTerminal",
            "justMyCode": false
        }
    ]
}

后记

学python很久了,现在才开始研究怎么调试,属实是太懒了,不过没有成系统的指导也是问题之一吧。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐