launch.json 的 args 字段必须是字符串数组,即每个参数独立成项,如["--input", "data.txt"];拼接写法、混入program路径、顶层解析args均会导致调试失败。

launch.json 的 args 字段必须是字符串数组
VSCode 只在 F5 启动调试时读取 args 字段,而且它**必须是 JSON 数组**,每个参数单独一项。写成 ["--input data.txt"] 是错的——这会被当做一个参数传给 Python,sys.argv[1] 就是整个字符串 "--input data.txt",而不是两个独立项。
正确写法示例:
["--input", "data.txt", "--verbose"]-
["--name", "Alice Smith"](含空格的值直接写,JSON 和 VSCode 会自动处理) -
["--config", "{\"port\":8080}"](需要 JSON 字符串内容时,内部引号要转义)
常见错误:把参数拼进 program 路径里,比如 "program": "main.py --input data.txt"。这会导致启动失败,因为 program 必须是纯文件路径,如 "${file}" 或 "${workspaceFolder}/src/main.py"。
参数解析逻辑必须放在 if __name__ == "__main__": 块内
断点不生效、或一启动就报 FileNotFoundError,大概率是因为代码在模块顶层就用了 sys.argv 或调了 argparse.ArgumentParser().parse_args()。
VSCode 调试器加载脚本时,会先执行所有顶层语句,此时 args 还没传入进程,sys.argv 仍是默认值(只有脚本名)。所以:
- 所有参数解析必须包裹在
if __name__ == "__main__":块中 - 避免在 import 阶段打开文件、连接数据库、初始化配置等依赖参数的操作
- 调试时可在
parse_args()后加一句print(args),确认是否真收到了预期值
想让“Debug Python File”按钮带参,得配 purpose 和 console
VSCode 默认的绿色虫子图标(“Debug Python File”)不读 args,除非你显式告诉它走终端调试路径。
必须同时满足以下三点:
- 配置名严格为
"Python: Current File (Integrated Terminal)"(大小写、括号、空格都不能错) - 加上
"purpose": ["debug-in-terminal"] - 加上
"console": "integratedTerminal"
缺一不可。否则点按钮仍走内部调试器,args 彻底失效。
attach 模式下 args 字段完全无效
如果你用的是 request: "attach"(比如通过 python -m debugpy --listen 5678 script.py arg1 arg2 启动),那么 launch.json 里的 args 字段**被完全忽略**。
参数必须直接跟在脚本路径后面,用空格分隔:
- ✅ 正确:
python -m debugpy --listen 5678 ./main.py --input data.txt - ❌ 错误:
python -m debugpy --listen 5678 ./main.py "--input data.txt"(引号会让 shell 当作一个参数) - ⚠️ 强烈建议加
--wait-for-client,防止代码执行太快、断点跳过
另外,launch.json 中即使只做 attach 配置,也得保证 JSON 语法合法——比如 "args": ["a", "b"] 缺少引号会导致整个配置解析失败,连 attach 都无法触发。


















