惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
大猫的无限游戏
大猫的无限游戏
H
Help Net Security
P
Proofpoint News Feed
D
DataBreaches.Net
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
宝玉的分享
宝玉的分享
Recorded Future
Recorded Future
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
S
SegmentFault 最新的问题
C
Cisco Blogs
L
LangChain Blog
博客园 - 聂微东
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
量子位
AWS News Blog
AWS News Blog
爱范儿
爱范儿
Know Your Adversary
Know Your Adversary
F
Full Disclosure
MyScale Blog
MyScale Blog
Stack Overflow Blog
Stack Overflow Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Microsoft Azure Blog
Microsoft Azure Blog
S
Schneier on Security
Spread Privacy
Spread Privacy
P
Privacy International News Feed
人人都是产品经理
人人都是产品经理
V
Vulnerabilities – Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
美团技术团队
Latest news
Latest news
D
Docker
Scott Helme
Scott Helme
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
MongoDB | Blog
MongoDB | Blog
The Register - Security
The Register - Security
T
Tailwind CSS Blog
SecWiki News
SecWiki News
C
CERT Recently Published Vulnerability Notes
Application and Cybersecurity Blog
Application and Cybersecurity Blog
S
Security Affairs
G
GRAHAM CLULEY
Simon Willison's Weblog
Simon Willison's Weblog
Martin Fowler
Martin Fowler
I
InfoQ
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Tenable Blog

追梦人物的博客

0x05:Merkle Tree & Patricia Trie 0x04:ECDSA - 以太坊设计与实现 LeetCode 105 从前序与中序遍历构造二叉树 迭代算法原理 + 完整证明 0x03:Address - 以太坊设计与实现 0x02:Secp256k1 - 以太坊设计与实现 0x00:专栏开篇 - 以太坊设计与实现 0x01:RLP 编码 - 以太坊设计与实现 Bellman-Ford 算法原理及其在 DeFi 套利中的应用 - 追梦人物的博客 迪杰斯特拉(Dijkstra)最短路径算法原理、实现与证明 - 追梦人物的博客 实战:CEX-DEX 稳定币套利监控程序开发 - 追梦人物的博客 CEX-DEX 稳定币套利模型 - 追梦人物的博客 Uniswap 手续费和协议费机制剖析 - 追梦人物的博客 Uniswap 流动性机制及相关数学原理分析 - 追梦人物的博客 uv 替代 pyenv + pipx + poetry 环境管理实践 Rust 项目从创建到发布 - 追梦人物的博客 比特币跨市场套利的数学模型 - 追梦人物的博客 ERC-20 相关知识点总结 - 追梦人物的博客 Django 老项目如何从 SQLite 迁到 PostgreSQL 自动生成接口文档 - HelloDjango - django REST framework 教程 单元测试 - HelloDjango - django REST framework 教程 限制接口访问频率 - HelloDjango - django REST framework 教程 API 版本管理 - HelloDjango - django REST framework 教程 如何在 Windows 下搭建高效的 django 开发环境 拓展Python Markdown - 追梦人物的博客 加缓存为接口提速 - HelloDjango - django REST framework 教程 基于 drf-haystack 实现文章搜索接口 - HelloDjango 评论接口 - HelloDjango - django REST framework 教程 实现分类、标签、归档日期接口 - HelloDjango - django REST framework 教程 在接口返回Markdown解析后的内容 - HelloDjango - django REST framework 教程 文章详情接口 - HelloDjango - django REST framework 教程 分页 - HelloDjango - django REST framework 教程 使用视图集简化代码 - HelloDjango - django REST framework 教程 用类视图实现首页 API - HelloDjango - django REST framework 教程 实现博客首页文章列表 API - HelloDjango - django REST framework 教程 初始化 RESTful API 风格的博客系统 - HelloDjango django-rest-framework 是什么鬼? - HelloDjango - django REST framework 教程 结束 or 开始? - HelloDjango Coverage.py 统计测试覆盖率 - HelloDjango - Django博客教程(第二版) 单元测试:测试评论应用 - HelloDjango - Django博客教程(第二版) 单元测试:测试 blog 应用 - HelloDjango Django Haystack 全文检索与关键词高亮 - HelloDjango Django 博客实现简单的全文搜索 - HelloDjango - Django博客教程(第二版) 开启 Django 博客的 RSS 功能 - HelloDjango 统计各个分类和标签下的文章数 - HelloDjango - Django博客教程(第二版) 稳定易用的 Django 分页库,完善分页功能 - HelloDjango 通过 Django Pagination 实现简单分页 - HelloDjango 在脚本中使用 ORM:Faker 批量生成测试数据 - HelloDjango Django 官方推荐的姿势:类视图 - HelloDjango - Django博客教程(第二版) Django 使用 union 合并不同模型(Model) 的查询集(QuerySet) 开发博客文章阅读量统计功能 - HelloDjango - Django博客教程(第二版) 使用 Docker 让部署 Django 项目更加轻松 - HelloDjango 使用 Certbot 向 Let's Encrypt 免费申请 HTTPS 证书 - HelloDjango 使用 Fabric 自动化部署 - HelloDjango 博客代码开源啦 - 追梦人物的博客 (赠书)推荐一本django书籍:Django企业开发实战 - 追梦人物的博客 Nginx+Gunicorn+Supervisor 部署 Django 博客应用 - HelloDjango 优化博客功能细节,提升使用体验 - HelloDjango - Django博客教程(第二版) 交流的桥梁:评论功能 - HelloDjango - Django博客教程(第二版) 分类、归档和标签页 - HelloDjango - Django博客教程(第二版) 页面侧边栏:使用自定义模板标签 - HelloDjango - Django博客教程(第二版) 自动生成文章摘要 - HelloDjango - Django博客教程(第二版) Markdown 文章自动生成目录,提升阅读体验 - HelloDjango - Django博客教程(第二版) 让博客支持 Markdown 语法和代码高亮 - HelloDjango 开发博客文章详情页 - HelloDjango - Django博客教程(第二版) 创作后台开启,请开始你的表演 - HelloDjango - Django博客教程(第二版) 博客从“裸奔”到“有皮肤” - HelloDjango - Django博客教程(第二版) Django 的接客之道 - HelloDjango - Django博客教程(第二版) Django 迁移、操作数据库 - HelloDjango - Django博客教程(第二版) 创建 Django 博客的数据库模型 - HelloDjango 开始进入 django 开发之旅 - HelloDjango "空空如也"的博客应用 - HelloDjango - Django博客教程(第二版) 一种自顶而下的Python装饰器设计方法 - 追梦人物的博客 Python提取支付宝和微信支付二维码 - 追梦人物的博客 2018 - 我的学生生涯最后一年回顾 - 追梦人物的博客 批量清除todo练习参考答案 - Vue 2.x Todo 教程练习参考答案 筛选练习参考答案 - Vue 2.x Todo 教程练习参考答案 删除todo练习参考答案 - Vue 2.x Todo 教程练习参考答案 编辑todo练习参考答案 - Vue 2.x Todo 教程练习参考答案 添加todo练习参考答案 - Vue 2.x Todo 教程练习参考答案 标为完成练习参考答案 - Vue 2.x Todo 教程练习参考答案 入门仪式_Hello_Vue练习参考答案 - Vue 2.x Todo 教程练习参考答案 组件化todo应用 - Vue 2.x Todo 教程 批量清除todo - Vue 2.x Todo 教程 本地存储 - Vue 2.x Todo 教程 筛选 - Vue 2.x Todo 教程 还剩多少todo未完成 - Vue 2.x Todo 教程 自定义指令实现自动聚焦 - Vue 2.x Todo 教程 全部标为完成 - Vue 2.x Todo 教程 删除todo - Vue 2.x Todo 教程 编辑todo - Vue 2.x Todo 教程 添加todo - Vue 2.x Todo 教程 标为完成 - Vue 2.x Todo 教程 UI - Vue 2.x Todo 教程 显示todo列表 - Vue 2.x Todo 教程 入门仪式:Hello Vue - Vue 2.x Todo 教程 在学习django-rest-framework时收集的学习资料推荐 - 追梦人物的博客 区块链理论与应用研究小组成员招募书 - 追梦人物的博客 Python界网红,豆瓣工程师董伟明加了我的QQ后 - 追梦人物的博客 招募Django学习小组项目组核心成员 - 追梦人物的博客
VS Code 调试 Python - 追梦人物的博客
2024-04-28 · via 追梦人物的博客

一直以来都是使用 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 --