code runner选中运行报nameerror或referenceerror,因其执行环境隔离,不继承原文件变量定义,仅将选中代码作为独立临时脚本执行,适用于无上下文依赖的表达式,不支持需变量或函数引用的代码片段。

选中代码块运行时为什么报 NameError 或 ReferenceError
Code Runner 对选中代码的执行是“隔离环境”,不会继承当前文件里的变量或函数定义。比如你在文件顶部写了 name = "Alice",再选中 print(name) 运行,就会报 NameError: name 'name' is not defined。
它实际把选中的文本包装成一个临时脚本执行(如 Python 下生成 temp.py),不加载原文件上下文。JavaScript 同理,let x = 1; 和选中的 console.log(x); 分开运行就失效。
- 只适用于独立表达式:数学计算、字符串处理、正则测试、JSON.parse() 等无需外部变量的片段
- 支持的语言有限:
javascript、python、php、ruby、perl、powershell——c、go、rust不支持选中运行 - 若需调试带依赖的逻辑,改用 VSCode 的 Debug 模式 + 断点,别依赖选中运行
Python 里选中 input() 为什么卡住或报 EOFError
默认情况下,Code Runner 的选中运行仍走非交互式流程,即使开了 code-runner.runInTerminal,终端也未必获得 stdin 控制权。尤其在 Windows 上,PowerShell 或 Git Bash 终端常无法正确传递输入流。
根本原因是选中运行模式绕过了完整终端会话初始化,input() 或 prompt() 读不到用户键入。
- 唯一可靠解法:不选中,直接运行整个文件,并确保
code-runner.runInTerminal为true、code-runner.preserveFocus为false - 临时验证输入逻辑,可用硬编码代替:
name = "test"替代name = input("Name: ") - Node.js 用户注意:
readline模块同样失效,选中运行只支持同步表达式,不支持异步 I/O
怎么让 TypeScript 或 Rust 的选中代码也能跑起来
Code Runner 原生不支持 TypeScript 或 Rust 的选中运行 —— 它们必须先编译,而选中内容无法自动补全 import、类型定义或 crate 依赖。强行配置 executorMap 也没用,因为 $selectedText 变量根本不存在于 Code Runner 的变量系统中。
所谓“选中运行”,底层只对部分语言做了特殊适配(如 Python 把选中内容写入临时 .py 文件并用 python -u 执行)。TS 和 Rust 没这个机制。
- TS:必须先保存为
.ts文件,靠tsc编译出 JS,再用node执行 —— 选中片段缺类型上下文,tsc --noEmit都会报错 - Rust:
rustc要求完整 crate 结构,单个表达式如println!("hi");单独编译会失败,提示main function not found - 替代方案:用 Playground 类工具(如 TypeScript Playground、Rust Playground)粘贴验证;或本地起 REPL:
python -i、node -i、rusti(需安装)
code-runner.executorMap 里哪些变量真能用,哪些是坑
Code Runner 文档里列了一堆变量(如 $workspaceRoot、$relativeFile),但实际只有几个在所有语言中稳定可用。用错变量会导致命令拼接为空、路径错误或静默失败。
最常踩的坑是误用 $fileNameWithoutExt:它只去掉后缀,不处理路径分隔符。比如 src/main.py → src/main,后面接 .out 就变成 src/main.out,而多数命令期望在当前目录生成可执行文件。
- 安全可用的变量:
$dir(文件所在目录)、$fileName(含路径的完整文件名)、$fullFileName(同$fileName) - 慎用变量:
$fileNameWithoutExt(易因路径含斜杠出错)、$workspaceRoot(多根工作区下行为不确定) - 完全不可用变量:
$selectedText(文档有但实际未实现)、$lineNumber(无对应替换逻辑) - Windows 用户特别注意:
$dir返回的是C:\project\src,但 shell 命令里反斜杠要转义或换为正斜杠,否则cd C:\project\src会失败
executorMap 里,且没有运行时日志可查。











