code runner 运行含 input() 的脚本会失败,因其默认非终端模式下将输出重定向至无输入能力的 output 面板,导致 input() 等待 stdin 时卡住或抛 eoferror;解决方式是启用 code-runner.runinterminal: true 并配合 preservefocus: false 确保终端获得焦点。

Code Runner 默认不支持交互式输入,直接运行含 input() 的 Python 脚本会卡住或报错。
为什么 Code Runner 运行含 input() 的脚本会失败
Code Runner 默认使用非终端模式(runInTerminal 关闭),把输出重定向到 Output 面板,而 input() 依赖真实终端的 stdin 流。Output 面板没有输入能力,所以程序停在等待输入处,看起来像“卡死”或抛出 EOFError。
常见错误现象:
- Python 脚本执行到
input()后无响应,光标不动 - Output 面板只显示提示文字(如
"请输入姓名:"),但无法键入 - 终端里实际报错:
EOFError: EOF when reading a line
启用终端运行:修改 code-runner.runInTerminal 设置
这是最直接有效的解决方式——让 Code Runner 把代码扔进真正的集成终端执行,而非 Output 面板。
操作步骤:
- 打开 VSCode 设置(
Ctrl+,或Cmd+,) - 搜索
code-runner.runInTerminal - 勾选该选项(值设为
true) - 保存后重新运行脚本(
Ctrl+Alt+N)
注意:启用后,每次运行都会新开一个终端标签页(或复用已有终端),适合调试带交互的脚本;但对纯计算类脚本略显冗余。
避免全局影响:用 code-runner.executorMap 为 Python 单独配置
如果你只希望 Python 走终端,其他语言(如 JavaScript、Go)仍走 Output 面板,就别改全局 runInTerminal,而是定制 executorMap。
在 VSCode 设置中搜索 code-runner.executorMap,点击“在 settings.json 中编辑”,添加或修改 Python 条目:
"code-runner.executorMap": {
"python": "python -u $fileName"
}
关键点:
-
-u参数强制 Python 使用未缓冲的 stdout/stderr,避免输出延迟 - 这个命令本身不指定终端,所以必须配合
code-runner.runInTerminal: true才生效 —— 但你可以把它写成条件组合: - 更稳妥的写法(推荐):
"python": "python -u $fileName"+"code-runner.runInTerminal": true,再用code-runner.preserveFocus设为false,确保焦点自动跳到终端
替代方案:用 VSCode 原生 Python 扩展跑交互脚本
Code Runner 是通用型工具,对 Python 交互支持始终有局限。如果项目以 Python 为主,且频繁需要 input()、sys.argv 或调试断点,建议直接用官方 Python 扩展的 Run Python File in Terminal 命令(快捷键 Ctrl+Shift+P → 输入 “Python: Run Python File in Terminal”)。
优势:
- 原生支持参数传递(右键菜单可选“Run Python File with Arguments”)
- 与 Python 解释器路径、venv 自动联动
- 不会和 Code Runner 的快捷键冲突(后者是
Ctrl+Alt+N,原生是Ctrl+F5或命令面板)
Code Runner 更适合一键运行单文件、无输入、多语言混编的轻量场景;一旦涉及输入、环境变量、虚拟环境切换,它的配置就开始变脆。
真正容易被忽略的是:code-runner.runInTerminal 和 code-runner.preserveFocus 必须配合使用。只开前者,VSCode 可能不自动聚焦终端,你敲了字却没反应——以为又卡了,其实是焦点还在编辑器里。











