在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内容:
"pathMappings"
属性在本机调试时无需设置,因此应删去;- 同时为了这个调试配置好记,把
"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代码:
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()
。
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)
在修改过的代码中,
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代码