• 在VSCode中调试其他软件执行的python文件


    在VSCode中调试其他软件执行的python文件

    0. 实际场景

    我有一段python代码想在Metashape中运行,但是又想在中间某一步停下来查看变量值。由于Metashape的python环境不容易在vscode中配置,所以直接用vscode调试单个文件的方式无法实现这个想法。还好,通过Python Debugger插件和在代码中使用debugpy库,可以得到一种新的调试方式,下面介绍详细步骤。

    1. 在VSCode中安装插件Python Debugger

    在这里插入图片描述

    2. 配置launch.json

    打开要执行的python文件所在文件夹,配置调试方式:
    点击下图所示的“创建launch.json文件”:
    在这里插入图片描述
    vscode的中上部弹出菜单:
    在这里插入图片描述
    选择“Python Debugger”,弹出调试配置选项菜单:

    在这里插入图片描述
    选择“远程附加”,然后依次输入远程主机ip(默认为localhost,代表本机)和端口号(默认5678,也可以改为其他值):

    在这里插入图片描述
    在这里插入图片描述
    完成后,在.vscode目录下自动生成了调试配置文件launch.json,内容如下:

    {
        // 使用 IntelliSense 了解相关属性。 
        // 悬停以查看现有属性的描述。
        // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Python 调试程序: 远程附加",
                "type": "debugpy",
                "request": "attach",
                "connect": {
                    "host": "localhost",
                    "port": 5678
                },
                "pathMappings": [
                    {
                        "localRoot": "${workspaceFolder}",
                        "remoteRoot": "."
                    }
                ]
            }
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    这条配置的意思是,将调试器附加到localhost:5678端口。

    为了使断点功能正常工作,我们还需要修改上面的json内容

    1. "pathMappings"属性在本机调试时无需设置,因此应删去;
    2. 同时为了这个调试配置好记,把"name"属性的值改为"Python本机端口附加调试"

    修改后的launch.json如下:

    {
        // 使用 IntelliSense 了解相关属性。 
        // 悬停以查看现有属性的描述。
        // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Python本机端口附加调试",
                "type": "debugpy",
                "request": "attach",
                "connect": {
                    "host": "localhost",
                    "port": 5678
                }
            }
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3. 修改代码

    调试配置已经完成,接下来就是让代码监听localhost:5678端口。

    首先给出修改前的python代码:

    import os
    import numpy as np
    
    
    if __name__=='__main__':   
        a = np.array([0,0,1,1])
        b = a*2
        c=a+b
        print(c)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    想让代码中途停下来,不仅要让代码监听localhost:5678端口,还需要调用debugpy.breakpoint()

    import os
    import debugpy
    if __name__=='__main__':
        if debugpy.is_client_connected() is False:##### 防止重复listen
            debugpy.listen(("localhost", 5678))#####
            debugpy.wait_for_client()#####
        print('wait_for_client called')
        debugpy.breakpoint()#####
        a = np.array([0,0,1,1])
        b = a*2
        c=a+b
        print(c)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在修改过的代码中,

        if debugpy.is_client_connected() is False:##### 防止重复listen
            debugpy.listen(("localhost", 5678))#####
            debugpy.wait_for_client()#####
    
    • 1
    • 2
    • 3

    用于让debugpy监听本机5678端口,并且等待客户端(也就是VSCode的Python Debugger)连接;
    连接上调试器后,python继续往下执行代码,直到遇到debugpy.breakpoint()语句暂停执行,在VSCode中停下。此时便可查看各变量名,并且开始单步调试。

    4. 运行代码,启动Debugger

    完成2、3两步配置之后,先在Metashape中运行python脚本,再在VSCode中按配置的调试信息启动调试器,即可。
    代码执行在debugpy.breakpoint()后一句暂停。

    大意的同学可能会遇到如下图所示的问题:尝试设置断点发现,本应是红色实心圆的断点标志成了空心圆。也就是说,无法在目标行单击设置断点在这里插入图片描述
    这是由于,launch.json中默认生成的"pathMappings"属性还没有删去。删掉之后再运行,即可解决问题。

    或者,实在不愿意删去这个属性,那就把"localRoot"和"remoteRoot"改成正确的路径,也可以解决问题。

                "pathMappings": [
                    {
                        "localRoot": "本地路径",
                        "remoteRoot": "远程路径"
                    }
                ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这个属性实际上在Docker容器代码调试和远程调试中非常有用。

    5.参考

    VSCode官方文档——Debugging
    debugpy代码仓库
    调试在容器中运行的python代码

  • 相关阅读:
    超聚变服务器关闭超线程CPU的步骤(完整版)
    【PickerView案例14-复习第一天内容 Objective-C语言】
    数字后端——物理单元介绍(一)
    认识物联网
    ffmpeg之 一张/多张图片合成视频
    网络隔离环境下的跨网数据传输,如何保障安全性?
    走进人工智能的大门:打造职业梦想的契机
    一周速学SQL Server(第四天)
    八大排序(二)快速排序
    [译] MySQL-恢复被删除的Performance Schema 数据库
  • 原文地址:https://blog.csdn.net/qq_42679415/article/details/138165790