Visual Studio Code基础:使用debugpy调试python程序
相关阅读VS codehttps://blog.csdn.net/weixin_45791458/category_12658212.html?spm1001.2014.3001.5482一、安装调试器插件在VS code中可以很轻松地调试Python程序首先需要安装Python调试器插件如图1所示。图1 安装调试器插件Python Debugger是用于VS code的调试扩展通过debugpy提供强大的调试功能如设置断点、单步执行和变量检查支持脚本、Web 应用、远程进程和多线程程序等。二、简单调试使用下面的几种方式即可调试当前光标所在的文件即变量${file}表示的文件当有多个文件存在时这很重要。1. 使用运行选项卡点击“运行”选项卡下的“启动调试”如图2所示。图2 运行选项卡当VS code第一次进行调试时会要求用户选择调试器如图3所示。图3 选择调试器当一个文件第一次被调试时会要求用户选择调试配置这里选择“Python文件”就行如图4所示。图4 选择调试配置2. 使用快捷键F5默认情况下快捷键F5也可以启动调试。3. 使用右上角的下拉菜单点击右上角的下拉菜单中的“Python 调试程序: 调试 Python 文件”如图5所示。图5 下拉菜单4. 使用左选项栏打开左侧的“运行与调试”选项栏或使用CtrlShiftD快捷键点击“运行与调试”如图6所示。图6 调试与运行三、添加断点在开始调试前首先需要设置断点否则程序会持续运行就像非调试运行那样本节将以例1所示的Python文件为例进行说明。# 例1 d 1 class A: a 1 def __init__(self): self.b 2 def f(self): c 3 print(d, self.a, self.b, c) print(d) a A() a.f()将光标移动到需要设置断点的行左侧此时会有一个透明红点提示如图7所示此时单击鼠标左键就可添加断点。图7 断点提示将光标移动到需要设置断点的行左侧单击鼠标右键在菜单中选择“添加断点”也是可行的如图8所示。图8 右击菜单断点设置完成后以一个红点表示如图9所示。图9 成功设置断点删除已设置的断点很容易只需要将光标移动到断点上单击鼠标左键或者单击鼠标右键在菜单中选择“删除断点”如图10所示。图10 删除断点四、调试窗口现在可以使用第三节说明的任意一种方式开始调试了当程序因为断点而挂起时如图11所示。图11 调试界面首先来看调试工作栏其中有六个按钮可以点击分别是继续(F5)、逐过程(F10)、单步调试(F11)、单步跳出(ShiftF11)、重启(CtrlShiftF5)、停止(ShiftF5)如图12所示。图12 调试工具栏在“运行”选项卡下也可以找到这些功能如图13所示。图13 运行选项卡下面解释这五个按钮的功能。继续(F5)继续执行程序直到下一个断点或程序结束。逐过程(F10)逐行执行当前行的代码但在遇见函数调用时不会进入其中而是将函数内的代码全部执行完后停止在调用函数行的下一行。单步调试(F11)逐行执行当前行的代码如果有函数则会进入。单步跳出(ShiftF11)从当前函数返回停止在调用函数行的下一行。重启(CtrlShiftF5)重新启动调试重新加载代码并从头开始执行。停止(ShiftF5)停止调试结束程序执行。左侧的“运行与调试”选项栏中可以观察变量我更愿意称之为标识符的值它分为两类Locals和Globals如图14所示。图14 变量观察窗口Locals中显示的不只是当前行所在的作用域中的标识符而是当前行能访问到的除了全局作用域外所有作用域中的标识符图15是一个能证明它的例子Globals中显示的是当前文件的全局作用域中的标识符。special variables指的是首尾是双下划线的特殊标识符魔术方法或特殊属性function variables指的是函数标识符class variables指的是类标识符。图15 Locals窗口其实变量观察窗口中显示出标识符的值是魔术方法__repr__()返回的值其实是个字符串在没自定义魔术方法__expr__()时也就是使用print打印标识符时输出的值如例2所示print函数打印除了对象的所属类和地址。# 例2 d 1 class A: a 1 def __init__(self): self.b 2 def f(self): c 3 print(self.__repr__()) # 输出__main__.A object at 0x0000021B7F8B7F90 print(self) # 输出__main__.A object at 0x0000021B7F8B7F90 print(d, self.a, self.b, c) print(d) a A() a.f()因此可以自定义__expr__()方法从而控制变量观察窗口的值如例3所示不是所有对象都可以比如引用整数对象的标识符d就不行。# 例3 d 1 class A: a 1 def __init__(self): self.b 2 def f(self): c 3 print(self.__repr__()) # 输出This is class A print(self) # 输出This is class A print(d, self.a, self.b, c) def __repr__(self): return This is class A print(d) a A() a.f()此时的调试窗口如图16所示可以看到self标识符显示的值变成了自定义的字符串。图16 自定义调试窗口的显示值五、进阶调试如图6中的提示如果需要自定义运行和调试可以首先打开文件夹 点击“文件”选项卡下的“打开文件夹”如图17所示。图17 打开文件夹接着打开左侧的“运行与调试”选项栏或使用CtrlShiftD快捷键点击“创建 lauch.json 文件”如图18所示。图18 创建lauch.json文件或者直接在“运行”选项卡下点击“添加配置...”如图19所示。图19 添加配置接着会有图3和图4所示的选择调试器和选择调试配置还是按照之前所说的进行选择。在打开的文件夹中会创建一个.vscode子文件夹并在其中创建launch.json文件如图20所示。图20 新建的lauch.json该launch.json是一个调试的配置文件控制.vscode子文件夹所在的文件夹其中可以包含多个配置图20中只有一个每个配置由多个属性决定下面将说明这些属性的作用。以下三个属性是必须的。type调试器的类型。例如本文中的调试器是debugpy。request调试的模式有两种模式可供选择。launch启动程序由program属性决定并调试。将程序附加到一个正在运行的进程中进行调试。name配置的名字显示在“运行与调试”选项栏。下面的属性是可选项。persentation使用order、group和hidden属性来定义调试配置的显示。preLaunchTask定义在调试之前要运行的任务。postLaunchTask定义在调试结束时要运行的任务。internalConsoleOptions定义调试控制台的显示。serverReadyAction设置在调试时自动在浏览器打开URL。此外大多数调试器插件还支持以下属性。program要运行的可执行文件或源代码的路径例如${file}表示当前光标所在的文件的路径。args要传递给program的参数。env环境变量。cwd调试器的工作目录。默认值是${workspaceFolder}即当前工作区文件夹对于只打开一个文件夹的情况这就是指被打开的文件夹。对于工作区有多个文件夹的情况指的是该.vscode文件夹所在的文件夹如果使用${workspaceFolder:文件夹名}的格式则可以具体指定文件夹。port要附加到进程的端口。stopOnEntry是否在程序入口处断点。console指定程序输出的位置。internalConsoleVS code的调试控制台。integratedTerminalVS code的集成终端。externalTerminal系统的终端。当.vscode文件夹中存在launch.json文件时vscode会自动识别其中的调试配置并呈现在“运行与调试”选项栏中如图21所示。图21 “运行与调试”选项栏图6所示的“运行与调试”变成了绿色三角形并需要在列表中选择一个配置此时只有一个配置第二节中提到的所有调试都将以这个配置运行。想要打开配置文件很容易只需要使用“运行与调试”选项栏的齿轮或直接在“运行”选项卡下点击“打开配置”它们会打开当前选择的配置所在的配置文件如图22和23所示。图22 打开配置文件图23 打开配置文件添加配置可以通过“运行与调试”选项栏的列表中的“添加配置”或“运行”选项卡下点击“添加配置”进行它们在大部分情况下是等价的。除了每个文件夹可以有各自的launch.json文件还可以在setting.json文件中添加配置它会被所有文件夹共享如图24所示。图24 全局的调试设置此时的“运行与调试”选项栏中如图25所示。图25 “运行与调试”选项栏此时使用“运行与调试”选项栏的列表中的“添加配置”或“运行”选项卡下点击“添加配置”就有区别了。当工作区有多个文件夹时使用图18所示的“创建 lauch.json 文件”会要求选择创建配置文件的位置如图26所示。但此时使用图19的方式则默认指第一个文件夹。图26 选择文件夹工作区的配置保存在工作区临时设置文件夹的workplace.json中如果工作区尚未保存如图27所示。图27 临时保存的workplace.json文件如工作区已被保存则工作区配置被保存在.code-workplace后缀的工作区文件中如图28所示。图28 工作区文件