断点不生效需依次检查:launch.json中type必须为"python";python.defaultinterpreterpath须指向正确解释器;flask/django等需设"justmycode": false和"subprocess": true;多线程/异步推荐用breakpoint()。

断点不生效?先确认 launch.json 里用了 python 类型而非 coreclr 或 node
VSCode 的调试器靠 launch.json 中的 type 字段决定用哪个调试适配器。Python 必须是 "type": "python",写成 "type": "pwa-python"(旧版)或误填为其他语言类型,断点会完全被忽略,控制台也无报错提示。
常见错误场景:
- 从其他语言项目复制
launch.json后没改type - 安装了多个 Python 扩展(如 Python、Pylance、Jupyter),但没启用官方
ms-python.python - 工作区根目录下有多个
.vscode/launch.json,实际加载的是错误路径下的那个
验证方式:启动调试时看左下角状态栏是否显示 “Python Debugging”;或在断点行左侧点击,若出现实心红点且悬停显示 “Breakpoint set”,说明识别正常。
python.defaultInterpreterPath 配置错,ModuleNotFoundError 就跟着来
VSCode 不会自动继承系统 shell 的 PATH 或虚拟环境激活状态,它只认 python.defaultInterpreterPath 指向的解释器。哪怕你在终端里 source venv/bin/activate 后能跑通,VSCode 调试仍可能因解释器路径不对而找不到包。
实操建议:
- 按
Ctrl+Shift+P(Windows/Linux)或Cmd+Shift+P(macOS),输入 “Python: Select Interpreter”,选择对应虚拟环境下的python可执行文件(如./venv/bin/python或.\venv\Scripts\python.exe) - 该操作会自动写入工作区级
.vscode/settings.json,内容类似:"python.defaultInterpreterPath": "./venv/bin/python"
- 如果项目依赖
poetry或conda,务必选中其生成的解释器路径,而不是全局/usr/bin/python3
调试 Flask/Django 时卡在启动阶段?加 "justMyCode": false 和 "subProcess": true
Web 框架常通过子进程重启(如 Flask 的 debug mode 自动 reload)、或调用第三方库入口(如 Django 的 manage.py runserver),默认调试配置只 attach 主进程,导致断点进不去视图函数或中间件。
关键配置项作用:
-
"justMyCode": false:允许进入标准库和第三方包代码(便于排查依赖问题,但会变慢) -
"subProcess": true:让调试器自动 attach 子进程(Flask reload、Django auto-reload、multiprocessing 场景必需) -
"console": "integratedTerminal":避免输出被重定向丢失,方便看到print()和框架日志
示例片段(适用于 Flask):
{
"configurations": [
{
"name": "Python: Flask",
"type": "python",
"request": "launch",
"module": "flask",
"env": {
"FLASK_APP": "app.py",
"FLASK_ENV": "development"
},
"args": ["run", "--no-debugger", "--no-reload"],
"justMyCode": false,
"subProcess": true,
"console": "integratedTerminal"
}
]
}
调试多线程/异步代码,breakpoint() 有时比 UI 断点更可靠
VSCode 的图形化断点在 threading.Thread 或 asyncio 任务中容易失效——尤其当线程快速启停,或事件循环未被调试器 fully intercept 时。此时 breakpoint() 函数是更底层、更确定的暂停方式。
注意事项:
-
breakpoint()依赖PYTHONDONTWRITEBYTECODE和当前解释器支持(Python 3.7+),且必须确保调试器已 attach(即不是直接运行python script.py) - 它会在触发时暂停并跳转到对应行,但不会高亮显示“断点命中”,需注意调试控制台是否卡住
- 与
import pdb; pdb.set_trace()功能类似,但更现代;若你禁用了breakpoint()(比如设置了BREAKPOINT_HOOK环境变量),它就无效
真实场景中,遇到 asyncio task 内断点不触发,第一反应不是反复点红点,而是插入一行 breakpoint(),再启动调试。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











