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

news/2024/11/19 23:33:06/

python_0">在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": "."}]}]
}

这条配置的意思是,将调试器附加到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}}]
}

3. 修改代码

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

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

python">import os
import numpy as npif __name__=='__main__':   a = np.array([0,0,1,1])b = a*2c=a+bprint(c)

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

python">import os
import debugpy
if __name__=='__main__':if debugpy.is_client_connected() is False:##### 防止重复listendebugpy.listen(("localhost", 5678))#####debugpy.wait_for_client()#####print('wait_for_client called')debugpy.breakpoint()#####a = np.array([0,0,1,1])b = a*2c=a+bprint(c)

在修改过的代码中,

python">    if debugpy.is_client_connected() is False:##### 防止重复listendebugpy.listen(("localhost", 5678))#####debugpy.wait_for_client()#####

用于让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": "远程路径"}]

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

5.参考

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


http://www.ppmy.cn/news/1443654.html

相关文章

【 Vue 路由 跳转 路由守卫 】

Vue Router replace 编程式导航缓存路由组件 路由跳转的replace方法 作用:控制路由跳转时操作浏览器历史记录的模式浏览器的历史记录有两种写入方式:push 和 replacereplace是替换当前记录,路由跳转时候默认为push方式 replace 标签写法 : &…

深入探究ES5与ES6的主要区别

引言: 随着JavaScript语言的不断进化,ECMAScript的新版规范带来了诸多改变。其中,ES5(ECMAScript 5)自2009年以来已被广泛应用,而ES6(ECMAScript 2015)的推出则引入了许多创新特性&a…

为什么分类问题不能使用mse损失函数,更容易理解版本

分类问题通常不适合使用均方误差(Mean Squared Error,MSE)损失函数,原因如下: 1.输出差异: 输出差异的度量不同:MSE损失函数是基于预测值和真实值之间的差异的平方和进行计算的,适…

目标检测YOLO实战应用案例100讲-基于YOLOv5的目标检测与6D位姿估计算法研究(中)

目录 3.3 相机成像原理 3.3.1 坐标系的建立及关系 3.3.2 相机标定 3.3.3 相机畸变

Cgicc搭建交叉编译环境(移植到arm)

Cgicc GUN Project官网连接:Cgicc- GNU Project - Free Software Foundation 1. 下载源码 Cgicc下载地址: [via http] Index of /gnu/cgicc [via FTP] ftp://ftp.gnu.org/gnu/cgicc/ 目前最新版:3.2.20 2. 源码构建原理 一般&#xff…

鸿蒙应用ArkTS开发- 选择图片、文件和拍照功能实现

前言 在使用App的时候,我们经常会在一些社交软件中聊天时发一些图片或者文件之类的多媒体文件,那在鸿蒙原生应用中,我们怎么开发这样的功能呢? 本文会给大家对这个功能点进行讲解,我们采用的是拉起系统组件来进行图片…

form1弹出子窗体form2,拖动子窗体判断是否离开父窗体区域,含源码(学习笔记)

一、效果(进入和离开) 子窗体到达父窗体边缘时变色。 二、代码分析 判断父窗体的目的,可以控制子窗体要随父窗体走。上面代码需要加以处理。 如:this.Location new Point(parentPoint.X distanceFromEdge, this.Location.Ydis…

麒麟龙芯loongarch64 electron 打包deb包

在麒麟龙芯(loongarch64)电脑上 使用electron 开发桌面应用。之前用electron-packager 打包出来的是文件夹 是 unpack 包。现在需要打包deb包,依据开发指南开始打包。 在项目文件夹下 打开终端 输入 npm run packager 先打包unpack包 然后…