sublime text 无原生“一键运行整个项目”功能,其构建系统默认仅作用于当前文件;需通过自定义 build 文件调用外部脚本(如 run.sh)或使用 terminus 插件在终端中运行,且依赖已保存的 .sublime-project 文件以正确解析 $project_path。

Sublime Text 本身没有“一键运行整个项目”的原生功能,它不解析项目结构、不管理依赖、也不启动服务进程。所谓“一键运行多文件项目”,实际是把多个文件的编译/执行逻辑,封装进一个可触发的 Build System,再配合合理的路径和命令组织实现——本质是「用单个构建命令触发多步操作」,不是真正意义上的项目级运行。
为什么直接 Ctrl+Shift+B 无法运行整个项目
默认的 Build System(比如你配的 PythonRun.sublime-build)只作用于当前活动标签页的 $file。即使你打开了 20 个 .py 文件,Ctrl+Shift+B 也只会运行最前面那个。它不扫描目录、不识别入口文件、不处理 import 依赖链。
- 构建系统是“单文件上下文”的,变量如
$file、$file_path永远指向当前编辑的文件 - 如果你的项目需要先
cd到根目录再python main.py,而当前打开的是utils.py,那$file_path就不是你想要的路径 - 多个语言混用(如 Python + JS + Shell 脚本)时,无法靠一个构建系统覆盖全部
用自定义 build 文件调用 shell 脚本或主入口
这是最可控、兼容性最好的方式:把项目启动逻辑写成外部脚本(run.sh 或 start.py),再让 Sublime 的构建系统去调用它。这样你就绕过了 Sublime 对单文件的限制。
- 在项目根目录下新建
run.sh(Linux/macOS)或run.bat(Windows),内容例如:#!/bin/bash cd "$(dirname "$0")" python main.py --debug
- 创建
Packages/User/MyProjectRun.sublime-build,内容为:{ "cmd": ["sh", "$project_path/run.sh"], "working_dir": "$project_path", "selector": "source.python", "variants": [ { "name": "Run with Logs", "cmd": ["sh", "$project_path/run.sh", "2>&1 | tee logs/latest.log"] } ] } - 关键点:
$project_path只在你通过Project → Save Project As…保存过.sublime-project文件后才有效;否则 fallback 为$file_path,可能出错
用 Terminus 插件实现在内置终端中运行项目
如果项目需要交互输入(比如 input())、持续运行(如 Flask server)、或查看实时日志,原生构建系统会卡住 UI。这时候必须用 Terminus 插件接管终端控制权。
- 安装
Terminus后,配置一个命令绑定到快捷键(如Ctrl+Alt+R):[ { "keys": ["ctrl+alt+r"], "command": "terminus_open", "args": { "cmd": ["sh", "-c", "cd '$project_path' && python main.py"], "cwd": "$project_path", "title": "MyProject Runner" } } ] - 注意:
$project_path同样依赖已保存的项目文件;若未保存,可用$file_path/../做相对推导,但不健壮 - 避免在
cmd中硬编码路径,否则换机器就失效;优先用$project_path或 shell 层面的dirname $(realpath $0)
容易被忽略的关键细节
很多人配完 build 文件却始终不生效,问题往往不在 JSON 语法,而在三个隐性前提没满足:
-
Project → Save Project As…必须执行过,生成.sublime-project文件,否则$project_path为空字符串 - 构建系统里的
"selector"必须匹配当前文件的语法类型(右下角显示的 “Python”、“Plain Text” 等),不匹配则菜单里根本不会出现该构建项 - Windows 下调用批处理需用
cmd /c,不能直接写run.bat;macOS/Linux 的 shell 脚本要chmod +x,否则 Permission denied











