在vs code中基于shell脚本的python代码调试

背景

  1. 微软的vscode代码开发工具使用者越来越多,笔者本人很早就开始基于vscode开发,无论是python还是C++,很早就放弃了专用的IDE工具
  2. 开发代码肯定需要调试代码,IDE在这块可能会更强,vsode整体可能不及IDE,但平时一般也足够使用,要想方便调试,工具(插件)必须要用对,这样才能事半功倍
  3. 平时的工作中,无论是自己写的python代码工程,还是开源的代码,一般都会提供运行脚本,shell脚本中会把参数或者环境变量设置好,如train.sh、val.sh等shell脚本,这种方法极大方便了用户,但很多用户却不知道怎么调试,一堆的启动参数该怎么设置?vscode中的launch.json中当然也可以配置,但实在是太麻烦了,并且每个项目都配一次,也不利于管理
  4. 如果能够不去配置这些参数,能直接利用现有的shell脚本直接启动,那该多方便,好在有现成的方法可用
  5. 如果我们想调试简单的python脚本,vscode也很简单,此处就不再赘述。本文主要说明如何直接将shell脚本作为入口来调试

依赖

  1. 基础的python依赖,请大家自己查找资料安装即可
  2. 本文核心依赖只有一个:debugpy ,安装也很简单
  3. pip3 install debugpy 

配置

shell脚本配置

一个常规的shell脚本如下所示

#!/usr/bin/env bash

export CUDA_VISIBLE_DEVICES=1

CONFIG=projects/config.py
OUTPUT_DIR=/data/deeplearning/debug_test

RUN_CMD="python3"
cmd="${RUN_CMD} tools/train.py $CONFIG \
   --work-dir $OUTPUT_DIR

echo "cmd: $cmd"
$cmd

如果想使用 debugpy调试,只需要将脚本中启动命令修改下即可

#!/usr/bin/env bash

export CUDA_VISIBLE_DEVICES=1

CONFIG=projects/config.py
OUTPUT_DIR=/data/deeplearning/debug_test

# RUN_CMD="python3"
RUN_CMD="python3 -m debugpy --listen 888 --log-to ${OUTPUT_DIR} --wait-for-client"
cmd="${RUN_CMD} tools/train.py $CONFIG \
   --work-dir $OUTPUT_DIR

echo "cmd: $cmd"
$cmd

以上配置,相当于起了一个端口为888的服务。--log-to参数可以去掉,该参数主要是存放调试日志用的,可以不用。

vs code的launch.json配置

 在此给出一个本人使用的简单配置作为参考

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python:debugpy调试样例",
            "type": "python",
            "request": "attach",
            "connect": {
                "host": "localhost",
                "port": 888
            },
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}/",
                    "remoteRoot": "/data/deeplearning/code/debug_project"
                }
            ],
            "logToFile": true,
            "justMyCode": false
        },
    ]
}

 核心配置是connect部分,此处的端口必须和刚才debugpy中的端口一致;

另外,name字段为自定义字段,该字段在启动调试的时候需要选择。

另外:使用vscode的workspace工作区,可以在该工作区下开发多个python工程,这些工程共享一个launch.json文件,此时把pathMappings中的remoteRoot设置为workspace路径。

这样设置后,调试其他所有工程的时候,都不需要修改launch.json配置文件,只需要调整每个工程里的shell脚本启动命令即可

开始调试

启动脚本

bash train.sh

直接正常运行启动脚本即可,启动后,项目并没有实际运行,而是挂起后等待调试(wait-for-client)

启动调试

  1. 设置断点 :必须先把断点设置好,不然启动后程序就直接运行了,可以在程序入口处直接设置一个断点
  2. 启动调试:如下所示,点击vscode左侧的调试按钮,上方选择刚才配置的name,点击绿色运行按钮即可

至此,如果程序没有错误,会自动运行至第一个断点处,各位就可以开启美妙的调试流程了。 

后记 

  1. 本文主要针对从shell脚本作为入口进行直接调试,其他调试不需要这么复杂 
  2. 不过对于正式的python项目或者C++项目,还是建议大家提供shell脚本的作为启动脚本,你好我好大家好,也是一个好习惯。

          

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值