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

ops/2024/9/25 4:25:14/

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/ops/16393.html

相关文章

Linux之ebpf(1)基础使用

Linux之ebpf(1)基础使用 Author: Once Day Date: 2024年4月20日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可以参考专栏:Linux基础知识_Once-D…

利用滚动索引来管理海量Elasticsearch数据

当面对大规模数据集时,单个Elasticsearch索引的数据量若持续增长,可能导致分片容量过大,进而引发查询时内存不足、甚至整个集群崩溃的问题。为避免这种情况,我们可以采用滚动索引(Rollover Index)这一策略&…

react 实现自动创建api 请求文件

需求: 前后端分离的情况下前端要调用后端的接口要写很多接口调用的定义文件很繁琐,切没有意义都是体力劳动 进程: 让后端使用swagger 或者其他的openpai 格式的组件将server 端的接口喷出如果是swagger 的话一般会有一个口子 /v2/api-docs…

leetcode 53 最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1…

对2023年图灵奖揭晓看法

2023年图灵奖揭晓,你怎么看? 2023年图灵奖,最近刚刚颁给普林斯顿数学教授 Avi Wigderson!作为理论计算机科学领域的领军人物,他对于理解计算中的随机性和伪随机性的作用,作出了开创性贡献。这些贡献不仅推…

车企如何利用数据技术,指导汽车全生命周期的业务运营?

引言:数据正作为重点,为行业提供不可或缺的指导 《汽车数据发展研究报告(2023)》指出,汽车行业正由传统硬件制造向“电动化、智能化、网联化”方向转变。德勤预测,到 2025 年,汽车行业 20%的利…

深入理解Spring Boot钩子函数

在软件开发中,Spring Boot已经成为了构建Java应用程序的首选框架之一。它简化了应用程序的开发过程,并提供了丰富的功能和扩展性。 Spring Boot的钩子函数(Hook Functions)是其核心特性之一,能够在应用程序的生命周期…

八、Python+FFmpeg,实战直播推流

1,环境变量 将 python.exe 的路径添加到环境变量中。 2,创建 py 文件,调用 ffmpeg import subprocess import time #ffmpeg 录屏:5 秒 ffmpeger=subprocess.Popen(ffmpeg -thread_queue_size 16 -f gdigrab -i desktop -s 1280x720 -vcodec libx264 -y test2.mp4, she…