ruff在vscode中必须手动指定为python活动linter,否则检查不触发;需确保ruff命令终端可用、pyproject.toml启用extend-select=["i","d","up"]、settings.json中配置"[python]"块的formatonsave、defaultformatter和codeactionsonsave。

Ruff 在 VSCode 中不会自动接管 Python 代码检查——装完插件、装完 CLI,还得手动指定它为 Linter,否则 ruff check 根本不触发。
必须手动选中 Ruff 作为 Python 的活动 Linter
VSCode 默认不把 Ruff 当作 Linter,即使插件已启用、ruff 命令终端可用,语法检查也不会出现。这不是 bug,是设计逻辑。
- 按
Ctrl+Shift+P(Windows/Linux)或Cmd+Shift+P(macOS),打开命令面板 - 输入
Python: Select Linter,回车 - 在弹出列表中选择
Ruff(不是 “None” 或 “pylint”) - 确认后,VSCode 会在状态栏右下角显示 “Ruff” 字样,表示已激活
这一步漏掉,# noqa 不生效、错误红线不出现、保存时也无 lint 提示——所有配置都白搭。
CLI 必须能被 VSCode 终端识别,且路径一致
VSCode 的 Ruff 扩展不带二进制,完全依赖你本地安装的 ruff 可执行文件。但 VSCode 图形界面和内置终端对 PATH 的加载可能不一致,尤其在 macOS 或使用 conda/poetry 的项目里。
- 在 VSCode 内置终端运行
ruff --version,必须返回版本号(如ruff 0.7.2) - 如果报错
command not found: ruff,重启 VSCode 通常无效;需检查是否装在当前 Python 环境里(比如用pip install ruff但 VSCode 解释器选的是另一个 venv) - 推荐统一用
pipx install ruff,避免环境切换导致路径丢失 - 若仍不行,在 VSCode 设置中搜索
python.linting.ruffPath,填入绝对路径(如/Users/xxx/.local/bin/ruff),别用~
pyproject.toml 至少要启用 E/F/W/I/D/UP 规则
Ruff 默认只开 E(PEP8 错误)、F(PyFlakes)、W(警告),但 Flake8 用户习惯的导入排序(I)、docstring 检查(D)、语法升级提示(UP)全都不在默认集里。
- 在项目根目录的
pyproject.toml中加这段:
[tool.ruff] select = ["E", "F", "W"] extend-select = ["I", "D", "UP"] line-length = 88 ignore = ["E501"] # 可选:忽略行过长
select 和 extend-select 是并集关系,不是覆盖;ignore 对两者都生效。没写 extend-select = ["I"],import os, sys 就不会被提示改成两行。
VSCode 设置里不能只靠全局 defaultFormatter
很多人配了 "editor.defaultFormatter": "charliermarsh.ruff" 却发现保存没反应——因为这个设置必须放在语言专属块里,否则 VSCode 不认它是 Python 的格式器。
- 在工作区
.vscode/settings.json中写:
{
"[python]": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "charliermarsh.ruff",
"editor.codeActionsOnSave": {
"source.fixAll": true,
"source.organizeImports": true
}
}
}
注意:"[python]" 是固定键名,不能写成 "python" 或 "[Python]";source.organizeImports 依赖 extend-select = ["I"],否则不生效。
最容易被忽略的是:Ruff 的 lint 行为和格式化行为由两个独立配置驱动——pyproject.toml 控制 ruff check 检什么,而 settings.json 的 codeActionsOnSave 控制保存时修不修。两者缺一不可,且各自有生效前提。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











