sublime text必须手动指定虚拟环境python绝对路径,ctrl+b仅认cmd第一项路径;windows用venv\scripts\python.exe,macos/linux用venv/bin/python,必加-u参数且路径含空格需加引号。

必须手动写死虚拟环境里的 python.exe 或 python 绝对路径,Sublime Text 不会自动识别、切换或继承任何 venv/pyenv/conda/poetry 环境。
构建系统里 cmd 第一项必须是虚拟环境的 python 可执行文件
这是唯一生效的方式。Sublime 的 Ctrl+B 运行逻辑极简:只看当前构建系统中 "cmd" 数组第一项是不是你想要的解释器路径。其余所有“激活”“source”“pyenv shell”“conda activate”在 Sublime 内部完全无效。
- Windows 下路径必须是
venv\Scripts\python.exe(不是venv\python.exe,也不是venv\Scripts\python.bat) - macOS/Linux 下路径必须是
venv/bin/python(不是venv/python,也不是venv/bin/python3—— 即使它存在,也得用python这个名字) - 路径含空格或中文时,整个字符串必须用双引号包裹:
"C:/My Project/venv/Scripts/python.exe" - 别依赖
PATH或path字段:即使你在构建系统里写了"path": "./venv/Scripts",cmd仍会调用系统默认python,除非你显式写出完整路径
为什么一定要加 -u 参数
不加 -u 会导致 print() 输出延迟、input() 卡死、日志不实时——这不是 bug,是 Python 默认启用 stdout/stderr 缓冲的行为。Sublime 的构建系统不提供伪终端(pty),所以必须靠 -u 强制无缓冲。
- 正确写法:
"cmd": ["./venv/Scripts/python.exe", "-u", "$file"] - 错误写法:
"cmd": ["python", "$file"](调的是系统 Python,且无-u) - 错误写法:
"cmd": ["./venv/Scripts/python.exe", "$file"](进了 venv,但输出卡住)
相对路径 vs 绝对路径:working_dir 是关键
用相对路径(如 "./venv/Scripts/python.exe")看似方便,但它的解析起点是你按 Ctrl+B 时**当前文件所在目录**,不是项目根目录。稍不注意就报 “file not found”。
- 推荐方案:设
"working_dir": "$project_path",再配相对路径:"cmd": ["./venv/Scripts/python.exe", "-u", "$file"] - 更稳方案:直接用绝对路径,比如
"cmd": ["C:/dev/myproj/venv/Scripts/python.exe", "-u", "$file"] - 绝对路径要写全:不能用
~(Sublime 不展开波浪号),也不能用%USERPROFILE%(Windows 环境变量不生效) - 如果你在
src/main.py里按Ctrl+B,而venv在项目根目录,那么./venv/...是从src/开始找,必然失败
多项目怎么避免每次手动切构建系统
把构建系统定义直接塞进 .sublime-project 文件,打开项目就自动加载,不用手动选。
- 项目根目录新建
myproject.sublime-project,内容包含"build_systems"字段 - 里面直接嵌入完整的构建配置 JSON,
"cmd"指向本项目venv路径 - 这样不同项目开不同窗口,各自用各自的 venv,互不干扰
- 别把构建系统文件(
.sublime-build)放在Packages/User/下全局共享——路径写死就只能服务一个项目
最容易被忽略的一点:Sublime 启动方式影响环境变量继承。如果你用 pyenv 或 conda,且希望构建系统能读到它们的 which python 结果,必须让 Sublime 从 shell 启动(macOS 用 open -a "Sublime Text",Linux 用终端运行 subl),否则 which python 返回的永远是系统默认路径,跟你终端里看到的不一样。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











