搭建一个真正顺手的 Python 开发环境:编辑器、uv 与质量工具

2026-09-09 29 预计阅读时间: 1 分钟
来源: realpython.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:8 分钟

一个有效的 Python 开发环境,不是安装尽可能多的插件,而是缩短“写代码—运行—发现问题—修正”的循环。编辑器负责反馈,虚拟环境负责隔离,依赖工具负责复现,格式化和测试工具负责在提交前暴露问题。这几部分配合稳定后,新项目才能快速启动,旧项目也更容易维护。

环境的核心不是编辑器,而是可复现性

编辑器可以选择 VS Code、PyCharm、Neovim 或其他工具,但项目不应该依赖某台机器上的编辑器设置才能运行。真正需要进入版本控制的是 Python 版本约束、项目依赖、开发工具配置和锁文件。

一个实用环境通常包含以下层次:

  • Python 解释器:明确项目支持的版本,避免开发机与 CI 使用不同版本。
  • 虚拟环境:隔离不同项目的包,防止全局安装造成依赖冲突。
  • 依赖声明与锁定:记录项目需要什么,并固定实际安装的版本。
  • 编辑器反馈:保存时格式化,尽早提示导入、类型和语法问题。
  • 自动化检查:通过测试、静态检查和 CI 保证团队执行相同规则。

判断环境是否可靠,可以做一个简单测试:把仓库交给另一名开发者,他是否只需几条命令就能获得相同依赖并运行测试?如果答案依赖一长串口头说明,项目环境还没有真正固化。

用 uv 统一项目初始化、依赖和命令执行

uv 可以用来创建项目、管理虚拟环境、添加依赖并执行项目命令。下面是一套可以直接改造的最小实践。运行前需要先安装 uv,并确保系统中可以执行 uv 命令。

uv init effective-python-env
cd effective-python-env

uv add requests
uv add --dev pytest ruff

uv run python main.py
uv run ruff check .
uv run pytest

这里不需要手动激活虚拟环境:uv run 会在项目环境中执行命令。首次解析依赖后生成的锁文件应提交到版本控制,以便本地开发和 CI 使用一致的依赖集合。

如果团队习惯激活环境,也可以这样操作:

uv venv

# macOS / Linux
source .venv/bin/activate

# Windows PowerShell
# .venv\Scripts\Activate.ps1

python --version

不要把 .venv 提交到 Git。可以在 .gitignore 中保留以下规则:

.venv/
__pycache__/
.pytest_cache/
.ruff_cache/
*.pyc

把质量规则写进项目,而不是只放在编辑器里

编辑器中的格式化按钮很方便,但只有项目配置才能让命令行、不同编辑器和 CI 得到一致结果。可以在 pyproject.toml 中集中配置 Ruff 和 pytest:

[project]
name = "effective-python-env"
version = "0.1.0"
description = "A reproducible Python development environment"
requires-python = ">=3.12"
dependencies = [
    "requests>=2.32.0",
]

[dependency-groups]
dev = [
    "pytest>=8.0.0",
    "ruff>=0.9.0",
]

[tool.ruff]
line-length = 100
target-version = "py312"

[tool.ruff.lint]
select = ["E", "F", "I", "B"]

[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "-q"

版本范围只是示例,应根据项目支持周期调整。EF 覆盖常见错误,I 检查导入顺序,B 提示一部分容易埋下缺陷的写法。规则不宜一次开得过多;在旧项目中,可以先建立基线,再逐步收紧。

配套的最小代码和测试可以写成:

# calculator.py
def add(left: int, right: int) -> int:
    return left + right
# tests/test_calculator.py
from calculator import add


def test_add() -> None:
    assert add(2, 3) == 5

然后执行完整检查:

uv run ruff format --check .
uv run ruff check .
uv run pytest

需要自动修正常见格式和导入问题时,可以运行:

uv run ruff format .
uv run ruff check --fix .

编辑器只负责调用项目已有能力

编辑器配置应尽量薄。选择工具时,重点确认它是否能正确选择 .venv 中的解释器,并支持以下工作流:

  • 保存文件时调用项目指定的格式化工具。
  • 在代码附近展示 Ruff 或语言服务器诊断。
  • 从编辑器运行单个测试,同时保留完整命令行测试入口。
  • 使用项目根目录作为工作目录,避免导入路径在编辑器中正常、在 CI 中失败。
  • 不偷偷使用全局 Python 或全局安装的检查工具。

团队不必强制所有人使用同一个编辑器,但应统一命令。例如,无论成员使用什么工具,提交前都能运行同样的 uv run ruff check .uv run pytest。编辑器差异因此停留在个人体验层,不会演变成构建差异。

落地时检查这五件事

一个小型项目可以从 uv + Ruff + pytest 开始,不必立即引入复杂的任务编排和大量插件。采用时建议确认:

  1. pyproject.toml 明确声明 Python 版本和直接依赖。
  2. 锁文件已提交,.venv 已忽略。
  3. 新机器能够通过少量命令同步环境并运行项目。
  4. 格式化、静态检查和测试既能在编辑器中执行,也能在终端中执行。
  5. CI 使用与本地相同的命令,而不是维护另一套隐含流程。

工具选择会变化,但边界应保持稳定:编辑器提升反馈速度,虚拟环境隔离依赖,项目文件记录规则,自动化命令验证结果。围绕这些职责搭建环境,比追逐某一套“最佳配置”更可靠。


相关推荐