追梦人物❤️包子 博主
一直走在追梦的路上。

VS Code 调试 Python

2024-04-28224 阅读0 评论

一直以来都是使用 PyCharm 开发 Python 程序,最近开始全面转向 VS Code。整体感觉 VS Code 对 Python 的支持已经基本完善了,用户体验也很友好。这篇文章总结和分享一些日常开发过程中使用 VS Code 调试 Python 的技巧。毕竟调试代码是开发中至关重要的一环,熟练掌握调试工具可以显著提高开发时排查问题的效率。

基础调试

最直接的调试方式是点击右上角 Run or Debug 下拉选项框,选择 Python Debugger: Debug Python File,这将以调试模式运行当前打开的 Python 文件,然后就可以逐行调试程序代码:

调试当前文件

VS Code 调试有关的配置都写在 .vscode/launch.json/ 中,如要启动调试,必须先在 launch.json 写好相关配置。上面的例子中之所以不需要做任何配置,是因为 VS Code 默认帮我们做了这件事。但默认配置只能满足基本需求,对于更复杂一点调试需求,例如指定程序运行参数、环境变量等,就必须在 launch.json 中做相关配置。

点击 VS Code 左侧带小虫子的三角形图标进入 Run and Debug 视图,点击 create a launch.json file,选择 Python Debugger,将弹出多个预设的配置项供选择,VS Code 还贴心地给出了各个选项的含义:

选择 Python File Debug the currently active Python file,VS Code 会自动创建 .vscode/launch.json,里面的内容如下:

{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python Debugger: Current File",
      "type": "debugpy",
      "request": "launch",
      "program": "${file}",
      "console": "integratedTerminal"
    }
  ]
}

configurations 是一个列表,列表每一项代表一个调试配置项,VS Code 会让我们选择某一个配置项来启动调试。关于配置项各个字段的含义,可以参考 VS Code 官方文档 Set configuration options

点击右上角 Run or Debug 下拉选项框,选择 Python Debugger: Debug using launch.json,再选择 Python Debugger: Current File,就会以刚刚生成的配置项来启动调试,效果和之前一样,但通过 launch.json,我们可以配置更多调试参数,例如在配置中通过 env 字段设置环境变量:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python Debugger: Current File",
      "type": "debugpy",
      "request": "launch",
      "program": "${file}",
      "console": "integratedTerminal",
      "env": {
        "BX_EMAIL_USER": "user@gmail.com",
        "BX_EMAIL_PASSWORD": "********",
        "BX_ALIST_USERNAME": "alist",
        "BX_ALIST_PASSWORD": "********"
      }
    }
  ]
}

调试指定文件

一些 Python 程序入口启动文件是固定的,将 program 字段的值设置为入口启动文件,启动调试时就会运行这个指定的文件。

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python Debugger: bx.py",
      "type": "debugpy",
      "request": "launch",
      "program": "${workspaceFolder}/bx.py",
      "console": "integratedTerminal"
    }
  ]
}

其中 ${workspaceFolder} 表示工作区根目录,上面的配置示例用于调试名为 bx.py 的 Python 文件。

尽量保证配置项的通用性

launch.json 文件一般会纳入版本管理,因此要尽量保证调试配置项的通用性,原则是任何人、任何时候、任何环境调试时都不需要修改 launch.json。当涉及到文件路径时,一定要使用 ${workspaceFolder}${file} 等预设的变量,保证文件路径不和特定的环境绑死。

带参调试

有时候需要传递一些参数给被调试的程序,以便测试特定的功能或场景,可以通过 args 字段来指定参数。下面是一个静态指定 bx.py 程序参数的例子,调试时 bx.py 将以固定的参数 arg1 --alist-user alist 启动:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python Debugger: bx.py arg1 --alist-user alist",
      "type": "debugpy",
      "request": "launch",
      "program": "${workspaceFolder}/bx.py",
      "console": "integratedTerminal",
      "args": ["arg1", "--alist-user", "alist"]
    }
  ]
}

如果需要根据不同的情况动态指定参数,可以使用 ${command:pickArgs} 来选择参数,下面是动态指定 bx.py 程序参数的例子:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python Debugger: bx.py with Arguments",
      "type": "debugpy",
      "request": "launch",
      "program": "${workspaceFolder}/bx.py",
      "console": "integratedTerminal",
      "args": "${command:pickArgs}"
    }
  ]
}

调试启动前,VS Code 会弹出输入框,让你输入本次调试时需传递给程序参数:

调试 Django

常规调试

VS Code 默认支持调试 Django,无需额外配置,开箱即用,启动方式和上文所述 基础调试 相同,启动后将以调试模式运行 django 开发服务器。

调试模板代码

VS Code 还默认支持调试 Django 模板代码,无需额外配置。例如下面是调试我的博客项目 django-dream-blog 主页模板代码时的界面,VARIABLES 面板包含所有视图函数传给模板的变量,调试的时候特别有用。

vscode django debug template

调试 Management Command

Django management command 入口启动文件是 manage.py,因此可用上文所述 带参调试 的方式来调试 management command。

Debug Console

在 VSCode 中调试 Python 时,Debug Console 提供了一个强大的界面,用于查看程序执行中的信息、执行任意表达式或直接与程序进行交互。这个控制台非常有用,尤其是在进行复杂的调试任务时,比如追踪变量状态、执行命令或调用函数等。

就像下面这样,可以在 DEBUG CONSOLE 面板里执行任意表达式并查看输出:

Logpoint

调试时用的最多的当然是 Breakpoint,程序会在运行到 Breakpoint 的时候停下来,但如果在循环内部打断点,每轮循环都会在断点停住,需要不停地按 F10 推进代码执行,比较麻烦,这时我会使用 logpoint 代替 breakpoint。

Logpoint 的效果和 print 类似,执行到 logpoint 时,程序不会停住,而是在 DEBUG CONSOLE 里打印出指定表达式的值。相比传统的 print 大法,logpoint 的好处是不会在代码里留下 print 语句,省去调试完毕后的清理工作。

Logpoint 的用法非常简单,具体可以参考 VS Code 官方文档 Logpoints

总结

  • Python 程序的调试需求一般包括调试当前文件、调试指定文件、带参调试,这些需求都可以通过 launch.json 配置得到满足。
  • VS Code 基本可以满足 Django 应用的调试需求,包括常规调试、调试模板代码、调试 management command 等。
  • 调试过程中可以通过 DEBUG CONSOLE 面板和程序进行交互。
  • Logpoint 可以代替 print 大法,省去调试完毕后的清理工作。调试循环体内的代码时 logpoint 也特别好用。

-- EOF --

0 评论
登录后回复