Sublime Text构建系统本质是调用外部命令而非启动终端,Ctrl+B执行JSON配置的子进程,不复用shell环境;需确保命令在PATH中或使用绝对路径,cmd数组比shell_cmd更安全可靠。

构建系统本质是调用外部命令,不是启动终端
Sublime Text 没有内置终端,Ctrl+B 触发的不是 shell 窗口,而是执行一个 JSON 配置定义的外部程序调用。你写的 cmd 数组最终会被操作系统以子进程方式执行,和你在终端里敲命令效果一致——但不会复用你的 shell 环境(比如 zsh 的 alias、fish 的函数、.bashrc 里的 export 都不生效)。
这意味着:如果你在终端能跑 python3 --version,但在 Sublime 里 Ctrl+B 报 [WinError 2] 系统找不到指定的文件,大概率是 ST4 找不到 python3 这个命令,而不是 Python 本身坏了。
- 先在系统终端确认
which python3(macOS/Linux)或where python3(Windows)输出路径 - 如果返回空,说明没加进
PATH,得先修复环境变量 - 如果返回路径(如
/usr/local/bin/python3),后续配置中可直接用这个绝对路径,绕过PATH查找
cmd 数组比 shell_cmd 更可靠,尤其跨平台时
shell_cmd 是把整条命令当字符串丢给系统 shell 解析,容易被空格、括号、重定向符号搞崩;cmd 是直接传参数数组,Python 的 subprocess.Popen(cmd, ...) 就是这么干的,更底层也更可控。
比如想运行 ts-node --transpile-only foo.ts,写成:
"cmd": ["ts-node", "--transpile-only", "$file"]
比下面这种安全得多:
"shell_cmd": "ts-node --transpile-only "$file""
-
$file变量只在文件已保存时展开,未保存的临时缓冲区会为空字符串,导致命令失败 -
$file_path是目录路径,$file_name是纯文件名,别混用 - Windows 下若 cmd 数组含反斜杠路径(如
C:Python39python.exe),必须双写为C:\Python39\python.exe或改用正斜杠C:/Python39/python.exe
selector 决定构建系统是否自动激活
selector 不是“选中代码”,而是匹配当前文件的 syntax scope。比如你右下角显示的是 Python,那实际 scope 是 source.python;显示 TypeScript,scope 通常是 source.ts。构建系统只有在 selector 和当前文件 scope 完全匹配时,才会出现在 Tools → Build System 菜单顶部,并在 Ctrl+B 时被自动选用。
常见 scope 值:
- Python:
source.python - TypeScript:
source.ts - JavaScript:
source.js - Shell script:
source.shell
如果配了 "selector": "source.python" 却没生效,右键文件 → View Package File → 搜索当前 syntax 文件(如 Python/Python.sublime-syntax),看它声明的 scope 是什么——有些第三方语法包会用 source.python.django 这类扩展 scope。
中文输出乱码、input() 卡住,多半是编码和 stdin 问题
默认构建系统不接管 stdin,所以 input() 会直接报错或挂起;中文 print 出来是问号,常因 Python 进程没拿到正确的 PYTHONIOENCODING 或系统 locale。
解决办法是在构建系统里显式设置:
"env": {
"PYTHONIOENCODING": "utf-8"
},
"cmd": ["python", "-u", "$file"]
-
-u强制 Python 使用无缓冲 stdout/stderr,避免输出延迟或丢失 -
env字段只影响本次子进程,不影响 ST4 主程序或其他构建系统 - Windows 上若仍乱码,可尝试把
cmd改成["py", "-u", "$file"],让 Windows Python Launcher 自动选版本并处理编码
需要交互输入?构建系统做不到。这时候得换插件,比如 Terminus 或 SublimeREPL,它们才是真正模拟终端行为的方案——但那是另一条链路,和构建系统无关。

















