跳转至

进阶 1 · 环境与版本管理

第 10 章给了 uv/pip 的速览。本章深入:虚拟环境原理多 Python 版本管理、两条工具链(uv / pip+venv)的完整工作流。Java 工程师习惯了"全局一个 JDK + Maven 管依赖",Python 的环境管理是工程化的第一道坎——理解原理比记命令更重要。


1.1 为什么环境管理是 Python 的"第一关"

  • Java 的世界

    全局 JDK(一个版本)
      └─ Maven 本地仓库 ~/.m2(依赖按坐标隔离,多项目共存)
    
  • Python 的世界

    全局解释器(第三方包默认装进它的 site-packages,全局共享)
      ├─ 项目A/.venv(独立解释器环境 + 独立 site-packages)
      └─ 项目B/.venv(独立……)
    

Java 把"依赖隔离"交给 Maven 的坐标体系;Python 把"依赖隔离"交给虚拟环境——每个项目一个独立的 site-packages。如果不隔离,A 项目要 django==3、B 项目要 django==5 就冲突,还会污染全局解释器。

两件事必须分开:① Python 解释器本身(哪个版本)② 第三方依赖(装在哪)。本章先讲 ①,第 2 章讲 ②。


1.2 虚拟环境原理

一个"虚拟环境"本质上是一个目录,里面有一份 Python 解释器的副本(或符号链接)+ 独立的 site-packages + 一个 pyvenv.cfg 标识文件。

.venv/
├── pyvenv.cfg          # 标识:基于哪个全局 Python 创建
├── Scripts/            # Windows(macOS/Linux 是 bin/)
   ├── python.exe      # 解释器入口
   └── activate        # 激活脚本
└── Lib/site-packages/  # 这个环境独有的第三方包

激活的本质:把 .venv/Scripts(或 bin)插到 PATH 最前面,让 python/pip 指向虚拟环境里的那份。激活后命令行提示符出现 (.venv)。退出用 deactivate

对照 JVM

Java 没有"虚拟环境"概念——因为 JVM 的依赖隔离在 Maven/Gradle 层(坐标 + 本地仓库)。Python 历史上把这事推给了"每个项目一份独立 site-packages",于是有了 venv 这一层。uv 等现代工具正在把这个体验往 Maven 靠拢(一个命令管环境+依赖)。


1.3 路线一:uv 环境管理

uv 把"解释器版本 + 虚拟环境 + 依赖"统一管理,最接近 Maven/Gradle 的"一站式"。

多 Python 版本:uv python

uv 能自动下载和管理多个 Python 版本(不用 pyenv/手动装):

uv python list                  # 列出可用版本(含已装 + 可下载)
uv python install 3.12 3.13     # 下载安装多个版本
uv python pin 3.13              # 给当前项目固定版本(写入 .python-version)

.python-version 文件记一个项目用哪个 Python 版本——团队成员/CI 读它自动用对的版本(类似 Java 项目声明 sourceCompatibility/targetCompatibility,但更直接)。

创建环境

uv init myproject               # 新项目:生成 pyproject.toml + .python-version + .venv
cd myproject
# 或在已有项目里:
uv venv                         # 只建 .venv(用当前/pinned 的 Python)
uv venv --python 3.12           # 指定版本建环境

uv sync / uv add按需创建 .venv 并选对 Python 版本(uv init 只生成项目骨架)——你通常不需要手动 uv venv

复现环境:uv sync

uv sync                         # 按 pyproject.toml + uv.lock 安装,建/补 .venv

这是别人 clone 你的项目后第一条命令:读 uv.lock 装出完全一致的依赖版本。uv 极快(Rust 实现,比 pip 快 10–100 倍)。

运行

uv run python main.py           # 在项目 .venv 里运行(无需手动激活)
uv run pytest                   # 在项目 .venv 里跑工具

uv run 自动确保环境就绪再执行——很多团队根本不激活,全程 uv run xxx

为什么主推 uv

一个工具搞定"解释器版本 + 虚拟环境 + 依赖锁定 + 运行",且极快。心智模型最接近你熟悉的 Maven/Gradle。本仓库的两个贯穿项目(logstatsbookmarks-api)都用 uv。


1.4 路线二:pip + venv(传统,企业最常见)

标准库自带,无需额外安装。在没有 uv 的环境(受限网络、CI 基础镜像、老系统)仍是主流。

创建与激活

# 1. 创建虚拟环境(用当前 python)
python -m venv .venv

# 2. 激活(平台不同)
.venv\Scripts\activate          # Windows CMD / PowerShell
source .venv/bin/activate       # macOS / Linux

# 3. 用完退出
deactivate

⚠️ Windows 的两个坑

  • 激活脚本是 .venv\Scripts\activate(不是 Unix 的 bin/)。
  • PowerShell 首次可能拒绝执行脚本,需一次性放宽:Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

多 Python 版本(pip 路线没有统一工具)

  • Windows:py launcher

    py -0                    # 列出已装版本
    py -3.13 -m venv .venv   # 用 3.13 建环境
    py -3.12 -m venv .venv12 # 用 3.12 建
    
  • macOS/Linux:pyenv

    pyenv install 3.13       # 下载版本
    pyenv local 3.13         # 项目固定(写 .python-version)
    python -m venv .venv
    

pip 路线的"多版本管理"要靠 py(Windows) / pyenv(Unix) 这类额外工具,而 uv 内建了——这是 uv 的显著优势之一。

装包

pip install requests             # 装进激活的 .venv
pip install -r requirements.txt  # 按清单装
pip freeze > requirements.txt    # 冻结当前版本

⚠️ 最常见的坑

没激活 .venvpip install → 装进了全局解释器,污染系统。养成习惯:先建/激活 .venv,再 pip。或干脆用 uv(默认就隔离)。


1.5 双路对照表

任务 uv pip + venv
装 Python 版本 uv python install 3.13 py -3.13 / pyenv install 3.13
固定项目版本 uv python pin 3.13 手写 .python-version(pyenv 读)
建虚拟环境 uv venv(或自动) python -m venv .venv
激活 通常不用(uv run source .venv/bin/activate
装依赖 uv add / uv sync pip install / pip install -r
复现 uv sync(读 uv.lock) pip install -r requirements.txt
锁文件 uv.lock(自动、精确、含哈希) requirements.txt(手冻)或 pip-tools
速度 极快(Rust)

1.6 选择建议

新项目 / 个人开发 / 想要一站式 → uv
企业受限环境 / CI 基础镜像无 uv / 维护老项目 → pip + venv

两者不冲突:同一项目可以同时有 .venv(被任一工具用)。本教程双路都讲透,你按环境选用。


本章练习

练习 1.1

uv 从零建一个项目 demo,固定 Python 3.13,说明 .python-version 文件的作用。

参考答案

uv init demo && cd demo
uv python pin 3.13
.python-version 内容为 3.13。任何人(含 CI)进入此目录用 uv 时,自动选 3.13——保证团队版本一致,免去"我这能跑你那不能跑"。

练习 1.2

解释为什么"没激活 .venvpip install requests"是危险的,uv 如何避免这个问题。

参考答案

未激活时 pip install 装进全局解释器的 site-packages,污染系统、影响所有项目、难以卸净。uv 默认在项目 .venv 里操作(uv add/uv sync/uv run 都自动定位项目环境),从机制上避免了"装错地方"。

练习 1.3

pip 路线下,如何在 Windows 用 Python 3.12 创建一个虚拟环境?macOS 呢?

参考答案

Windows:py -3.12 -m venv .venv 然后 .venv\Scripts\activate。 macOS:python3.12 -m venv .venv(需已装 3.12)后 source .venv/bin/activate;或用 pyenv 装版本。对比:uv venv --python 3.12 一个命令跨平台搞定。


← 回首页 | 下一章:进阶 2 · 依赖与包管理