F5调试才读args,其他方式均无效;args必须为字符串数组,program须为纯路径,参数解析逻辑须置于if name == "__main__":块内。

F5 调试才读 args,其他运行方式全无效 —— 这是绝大多数人配错的根源。
launch.json 里 args 必须是字符串数组,不是拼接字符串
常见错误是写成:"args": "--input data.txt"。这会让 Python 启动器把整个字符串当做一个参数传入,sys.argv 变成 ['main.py', '--input data.txt'],导致 argparse 解析失败或直接报 ModuleNotFoundError。
正确写法是每个参数单独一项,空格不合并:
"args": ["--verbose", "--input", "data.txt", "-o", "output.json"]
含空格的值(如人名、路径)直接用双引号包裹:"--name", "Alice Smith" → sys.argv 收到的就是 ['main.py', '--name', 'Alice Smith']。
参数本身要带引号(比如 JSON 字符串),得双重转义:"--config", "{\"port\":8080}"。
program 字段只能是纯路径,不能带参数
"program": "main.py" ✅
"program": "main.py --input data.txt" ❌
VSCode 的调试启动器只负责加载指定脚本文件,参数必须通过 args 字段传递。如果混在 program 里,会被当作模块名解析,大概率触发 ImportError: No module named 'main.py --input' 类错误。
另外,program 值建议用相对路径(如 "src/main.py"),避免硬编码绝对路径;若项目结构复杂,可配合 cwd 字段显式指定工作目录,否则 --input data.txt 可能因相对路径解析失败而找不到文件。
参数解析逻辑必须放在 if __name__ == "__main__": 块内
断点没命中、脚本一加载就报错,大概率是因为参数解析代码没做隔离。
如果 main.py 顶层就调了 parse_args() 或直接访问 sys.argv[1],调试器在导入模块阶段就会执行它 —— 此时 args 还没传进去,必然出错。
所有依赖参数的操作(读文件、连数据库、初始化配置)必须严格放在 if __name__ == "__main__": 块内,或其调用的函数内部。
调试时可在入口处加一行 print(sys.argv) 确认是否收到预期值,避免白忙活。
右键“Run Python File”和 Code Runner 完全无视 args
只有按 F5 或从 “Run and Debug” 面板选择配置才会读取 launch.json 中的 args。
右键 → “Run Python File in Terminal” 执行的是 python main.py,不走调试流程,也不读 args。
Code Runner 插件默认仍走 python main.py,除非你手动改它的 code-runner.executorMap 配置。
想让 “Debug Python File” 按钮也带参,必须加 "purpose": ["debug-in-terminal"],且配置名得是 Python: Current File (Integrated Terminal)。
最容易被忽略的一点:VSCode 不会自动记住你上次选的是哪个调试配置,F5 总是触发当前下拉菜单里选中的那个 —— 每次 F5 前务必盯一眼左下角的调试配置名称。











