vscode调试cli必须手动配置launch.json,默认配置失效;因cli依赖sys.argv、env及子进程,需正确设program或module、显式声明args/env、确保文件已保存、解释器路径正确且语言模式匹配。

VSCode 调试命令行工具(CLI)必须手动配置 launch.json,默认“当前文件”配置几乎必然失效——因为 CLI 工具通常依赖 sys.argv、环境变量或子进程行为,而未保存的文件、错误解释器、args 传参方式不对,都会导致断点不触发或调试静默退出。
为什么 program 不能只写 "${file}"
CLI 工具往往不是直接运行单个脚本,而是通过入口模块(如 python -m mycli)、安装后的可执行文件(如 mycli --help),或带相对路径的主模块调用。用 "${file}" 会强制以当前打开文件为入口,忽略 __main__.py 或 setup.py 定义的 console_scripts 行为。
- 若 CLI 是通过
pip install -e .安装的,应设"program": "${workspaceFolder}/venv/bin/mycli"(Linux/macOS)或"program": "${workspaceFolder}/venv/Scripts/mycli.exe"(Windows) - 若想模拟
python -m mypackage.cli,则改用"module": "mypackage.cli",并删掉"program"字段(VSCode 支持module字段启动包入口) - 不要在
program中写带空格或 shell 语法的字符串(如"python -m mycli"),VSCode 不解析 shell 命令,只会当作一个路径去执行
args 和 env 必须显式声明
CLI 的行为高度依赖命令行参数和环境变量,比如 DEBUG=1 mycli sync --dry-run。VSCode 不会自动继承终端环境,也不会把你在终端里敲的参数透传进去。
-
"args"必须是字符串数组,例如:"args": ["sync", "--dry-run"],不能写成"args": "sync --dry-run" -
"env"要补全所有运行时依赖项,常见如:"env": {"PYTHONPATH": "${workspaceFolder}", "DEBUG": "1", "MYCLI_CONFIG": "./test.conf"} - 如果 CLI 内部调用了
subprocess.run(..., shell=True),注意shell=True在调试环境下可能因PATH不一致而失败,建议临时改为shell=False或显式指定executable
断点不触发?先检查这三件事
红点显示了但程序跑完也没停——这不是 VSCode 的 bug,而是调试上下文没对齐。
- 右下角状态栏语言模式必须是对应语言(如 Python / Node.js),不是 Plain Text;否则断点根本不会注册
- 确认你选的解释器路径正确:按
Ctrl+Shift+P→Python: Select Interpreter,选中项目虚拟环境里的python(Node.js 同理,检查node路径是否指向你期望的版本) - 文件必须已保存:VSCode 调试的是磁盘上的文件,不是编辑器缓存;未保存修改 = 调试旧版本代码
- CLI 入口函数里有
if __name__ == "__main__":?确保断点打在该块内,而不是模块顶层(模块顶层在 import 时就执行,调试器还没接管)
CLI 调试最易被忽略的点是:它往往跨多个文件、依赖外部配置加载时机、甚至启动子进程。断点设在主函数第一行还不够,得确认控制流真走到那里——有时参数解析失败就提前 sys.exit() 了,根本进不去业务逻辑。











