vscode单步调试前需确保microsoft官方python扩展启用并重启,正确配置launch.json中program路径或module名称,web框架关闭重载,断点设在可执行语句,watch表达式须符合当前作用域。

VSCode单步执行前,必须确认 Python 扩展已启用
按 F5 没反应、断点变空心圆、右下角不显示 Python 解释器版本 —— 这些都是扩展没装好或没启用的明确信号。Microsoft 官方的 ms-python.python 扩展是唯一能提供完整调试能力的插件;ms-python.pylance 只负责补全和类型检查,不能调试。
操作要点:
- 打开扩展面板(
Ctrl+Shift+X),搜 “Python”,认准发布者是 Microsoft、名称含 “Python”、状态为“已启用” - 装完必须重启 VSCode,否则
F5仍无效 - 底部状态栏点击 Python 版本号,手动选对解释器(尤其用虚拟环境时)
launch.json 配置错一个字段,断点就永远不命中
断点设得再准,如果 launch.json 里 program 路径写错、或误用了 module 模式,VSCode 就会启动一个和你编辑的文件完全无关的进程 —— 断点自然失效。
常见配置陷阱:
-
program必须是相对${workspaceFolder}的路径,比如脚本在src/main.py,就得写"program": "src/main.py",不能写./src/main.py或绝对路径 - 用
module模式时(如python -m http.server),填的是模块名,不是文件名:"module": "http.server",不是"http.server.py" - Flask/FastAPI 等 Web 框架要关重载:
debug=False, use_reloader=False,否则调试器 attach 不到子进程
单步执行(F10/F11)停在哪,取决于你断点设在哪一行
Python 调试器只在可执行语句生效。在 def foo():、class Bar:、空行、注释行设断点,VSCode 会自动“挪”到下一行,但挪得不准很常见 —— 尤其遇到装饰器、多行字典或生成器表达式时。
稳妥做法:
- 把断点设在有副作用的语句上:变量赋值(
x = 1)、函数调用(print())、return、yield - 避免在
@decorator下方那行def设断点 → 实际停在函数体第一行,容易误判入口 - 鼠标悬停断点红点,看提示文字:如果是 “断点未命中”,优先查
launch.json;如果是 “已禁用”,右键点开检查是否误加了条件或命中次数限制
Watch 表达式输 user.name 报错?不是语法问题,是作用域不对
Watch 窗口不是 REPL,它只能求值当前栈帧里存在的变量。你在函数外定义的 user,进了另一个函数后,user 就不在作用域里了 —— 输入 user.name 必然报 ReferenceError。
排查建议:
- 先展开左侧
Variables面板,找到目标对象层级,右键复制完整路径(如locals.user.name),再粘贴进 Watch - 复杂嵌套对象别手敲,容易漏掉
locals/self/args这类上下文前缀 - 某些表达式(如
dict.keys())在调试器里可能返回不可迭代对象,Watch 显示Cannot evaluate expression是正常限制,不是 bug
launch.json 启动方式和你手动运行的命令不一致,或者框架偷偷 fork 了新进程。先盯住控制台输出的第一行,确认 VSCode 真的在跑你改的那份代码。











