极速 Python 包管理神器:uv 体验报告
如果你还在用 pip 安装包、用 conda 创建环境、用 virtualenv 管理虚拟环境,那你一定要试试 uv。这篇文章,我会详细介绍这款让我 "相见恨晚" 的 Python 包管理工具。
前言
作为一名 Python 开发者,我每天都要和包管理打交道。从最初的 easy_install,到后来的 pip,再到 conda、virtualenv、poetry、pyenv… 市面上的工具我几乎都用过。
直到有一天,我遇到了 uv。
说实话,第一次看到 uv 的介绍时,我是持怀疑态度的:“又一个 Python 包管理工具?能比 pip 好用多少?”
但当我真正用它跑了几条命令之后,我的心态发生了巨大转变:这玩意儿是真的香。
所以写了这篇博客,把 uv 推荐给更多 Python 开发者。如果你也在为 Python 环境管理烦恼,这篇文章或许能帮到你。
第一章:初识 uv —— 它到底是什么?
1.1 来自 Astral 的明星产品
uv 是由 Astral 公司开发的工具。Astral 这个名字你可能不熟悉,但他们的产品你一定听说过:
- ruff —— Python 代码检查工具,速度比 flake8 快 10-100 倍
- ruff formatter —— Python 代码格式化工具
没错,uv 和 ruff 是同一个公司的产品。这个公司专注于打造 "极速" 工具,而 uv 正是他们针对 Python 生态的包管理解决方案。
1.2 用 Rust 编写,为速度而生
uv 最大的特点是:快。
它是用 Rust 编写的,这让它在性能上远超用 Python 写的 pip、conda 等工具。具体有多快?官方给出的数据是:
| 操作 | pip | uv |
|---|---|---|
| 安装 requests | ~2.5 秒 | ~0.2 秒 |
| 创建虚拟环境 | ~8 秒 | ~0.2 秒 |
| 解析依赖 | 数十秒 | 毫秒级 |
这些数据可能因系统环境而异,但总体来说,uv 的速度是 pip 的 10-100 倍。
1.3 一个工具,替代六个
uv 的设计理念是 "大一统"——用一个工具解决所有 Python 环境管理问题:
| 工具 | uv 替代 |
|---|---|
| pip | ✅ uv pip install |
| pip-tools | ✅ uv pip compile |
| pipx | ✅ uv tool install |
| poetry | ✅ uv init, uv add |
| pyenv | ✅ uv python install |
| venv / virtualenv | ✅ uv venv |
没错,你不需要安装 pip、conda、poetry、pyenv、virtualenv、pipx 六个工具,只需要一个 uv。
1.4 为什么要换掉 pip?
你可能会问:“pip 我用了这么多年好好的,为什么要换?”
坦白说,如果你的项目规模不大、依赖不多,pip 完全够用。但随着项目复杂度增加,你会遇到这些问题:
pip 太慢:安装一个 numpy 可能要等半分钟,遇到依赖复杂的大包(如 tensorflow、torch)更是要等几分钟。
环境切换麻烦:要在多个 Python 版本和虚拟环境之间切换,你需要 pyenv、virtualenv、conda 等工具来回切换。
依赖管理不完善:pip freeze 生成的 requirements.txt 可能包含不必要的依赖,pip install -r requirements.txt 有时还会遇到版本冲突。
uv 正是为了解决这些问题而设计的。它不仅快,而且提供了统一的依赖管理方案。
第二章:安装 uv —— 5 分钟搞定
2.1 Windows 安装(推荐 PowerShell)
在 Windows 上安装 uv 有多种方式,我推荐使用 PowerShell 安装脚本,这是最简单的方式:
# 使用 PowerShell 安装脚本(推荐)
irm https://astral.sh/uv/install.ps1 | iex
或者,如果你已经安装了 scoop,可以用这个方式:
# 使用 scoop 安装
scoop install uv
另外,Windows 用户也可以用 winget:
# 使用 winget 安装
winget install --id=astral-sh.uv -e
2.2 macOS 安装
macOS 用户可以用 Homebrew:
# 使用 Homebrew 安装
brew install uv
2.3 Linux 安装
Linux 用户可以用 curl:
# 使用 curl 安装(适用于大多数 Linux 发行版)
curl -LsSf https://astral.sh/uv/install.sh | sh
或者通过包管理器:
# Debian/Ubuntu
apt install uv
# Fedora
dnf install uv
2.4 验证安装
安装完成后,打开一个新的终端窗口(记得重新打开,因为 PATH 可能需要刷新),输入:
uv --version
# 输出应该类似:
# uv 0.5.x
如果显示了版本号,说明安装成功。
2.5 遇到问题?
问题 1:无法运行脚本
如果遇到 "禁止运行脚本" 的错误,需要调整 PowerShell 的执行策略:
# 查看当前执行策略
Get-ExecutionPolicy
# 如果是 Restricted,修改为 RemoteSigned
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# 然后重新运行安装命令
irm https://astral.sh/uv/install.ps1 | iex
问题 2:找不到 uv 命令
安装后需要刷新环境变量,或者手动将 uv 的路径添加到 PATH:
# 查看 uv 的安装路径
where.exe uv
# 如果找到了,手动添加到 PATH
$env:PATH += ";C:\Users\你的用户名\.local\bin"
第三章:虚拟环境管理 —— 轻量快速
3.1 创建虚拟环境
这是 uv 最基础的功能之一。创建虚拟环境只需要一条命令:
# 创建默认环境(.venv)
uv venv
# 创建自定义名称的环境
uv venv myenv
# 指定 Python 版本
uv venv --python 3.11 myenv
uv venv --python 3.12 myenv
查看可用的 Python 版本:
# 列出所有可用版本(包括已安装和可下载)
uv python list
# 只显示已安装的版本
uv python list --only-installed
3.2 激活虚拟环境
创建环境后,需要激活才能使用:
# PowerShell
.venv\Scripts\Activate.ps1
# CMD
.venv\Scripts\activate.bat
# Bash (Git Bash / WSL / macOS / Linux)
source .venv/Scripts/activate
激活成功后,终端提示符会变化,显示当前环境的名称。
3.3 退出虚拟环境
# 通用方法
deactivate
# 或者直接关闭当前终端
3.4 删除虚拟环境
删除虚拟环境非常简单:
# Windows PowerShell
Remove-Item -Recurse -Force .venv
# 或者用 rd 命令
rd /s /q .venv
# Linux/macOS/Bash
rm -rf .venv
uv 创建的虚拟环境就是普通的 .venv 目录,不需要专门的删除命令。
3.5 与 conda 对比
我之前一直用 conda 管理环境,但 conda 有几个让人头疼的问题:
问题 1:体积太大
conda 本身加上 base 环境,少说也要 1-2GB。而 uv 创建的虚拟环境,只有 Python 解释器本身,几个 MB 而已。
问题 2:创建慢
conda create 创建环境可能要等几十秒,而 uv venv 只要不到 1 秒。
问题 3:频道混乱
conda 有 main、conda-forge、pytorch 等多个频道,有时候安装包会遇到找不到、版本冲突的问题。uv 直接用 PyPI,干净利落。
对比表
| 特性 | uv | conda |
|---|---|---|
| 创建速度 | <1 秒 | 10-30 秒 |
| 初始体积 | ~5 MB | ~500 MB |
| 包来源 | PyPI | 多频道 |
| 环境切换 | 快 | 慢 |
| 命令复杂度 | 简单 | 复杂 |
3.6 实际体验
让我用一个实际的例子展示 uv 的速度:
# 用 uv 创建环境
Measure-Command { uv venv --python 3.11 }
# 结果:大约 0.2 秒
# 对比:用 conda 创建环境
# Measure-Command { conda create -n test -y python=3.11 }
# 结果:大约 30 秒
这个差距是巨大的,尤其是在你需要频繁创建 / 删除环境的时候。
第四章:包管理 —— pip 的完美替代
4.1 安装包
这是 uv 最常用的功能。uv pip install 可以完全替代 pip install:
# 安装单个包
uv pip install requests
# 安装多个包
uv pip install requests numpy pandas
# 指定版本
uv pip install requests==2.28.0
uv pip install "requests>=2.28,<3.0"
# 从 requirements.txt 安装
uv pip install -r requirements.txt
# 从 Git 安装
uv pip install git+https://github.com/user/repo.git
# 从本地路径安装
uv pip install ./mypackage
# 安装可编辑模式(开发模式)
uv pip install -e ./mypackage
4.2 卸载包
# 卸载单个包
uv pip uninstall requests
# 卸载多个包
uv pip uninstall requests numpy
# 从 requirements.txt 卸载
uv pip uninstall -r requirements.txt
4.3 查看已安装的包
# 以 requirements 格式输出
uv pip freeze
# 以列表格式输出(更易读)
uv pip list
4.4 同步依赖
这是 uv 的一个特色功能。当你有 requirements.txt 或 pyproject.toml 时,可以用 sync 命令确保环境与文件一致:
# 同步到 requirements.txt
uv pip sync requirements.txt
# 同步到 pyproject.toml
uv sync
# 安装开发依赖
uv sync --group dev
4.5 性能对比实测
让我实际测试一下 uv 和 pip 的速度差距:
# 测试 1:安装 requests
# pip
Measure-Command { pip install requests }
# 耗时:约 3-5 秒
# uv
Measure-Command { uv pip install requests }
# 耗时:约 0.3-0.5 秒
# 测试 2:安装 numpy(更大的包)
# pip
Measure-Command { pip install numpy }
# 耗时:约 10-15 秒
# uv
Measure-Command { uv pip install numpy }
# 耗时:约 1-2 秒
# 测试 3:安装 pandas(依赖复杂)
# pip
Measure-Command { pip install pandas }
# 耗时:约 30-60 秒
# uv
Measure-Command { uv pip install pandas }
# 耗时:约 3-5 秒
可以看到,包越大、依赖越复杂,uv 的优势越明显。
4.6 依赖解析
uv 内置了强大的依赖解析器,能够:
- 并行下载:同时下载多个包
- 智能缓存:避免重复下载
- 冲突检测:安装前检测版本冲突
# 查看包的信息
uv pip show requests
# 检查是否有更新
uv pip list --outdated
# 升级包到最新版本
uv pip install --upgrade requests
4.7 离线安装
uv 支持离线模式,这在某些场景下很有用:
# 先在有网环境下载包到目录
uv pip install requests --target ./packages
# 在无网环境从目录安装
uv pip install --offline --target ./packages requests
第五章:Python 版本管理 —— 一个命令切换
5.1 列出可用版本
# 列出所有可用版本
uv python list
# 输出示例:
# cpython-3.13.0+cp313-cp313-manylinux_2_17-x86_64.manylinux2014_x86_64
# cpython-3.12.5+cp312-cp312-manylinux_2_17-x86_64.manylinux2014_x86_64
# cpython-3.11.9+cp311-cp311-manylinux_2_17-x86_64.manylinux2014_x86_64
# ...
5.2 安装指定版本
# 安装 Python 3.12
uv python install 3.12
# 安装特定小版本
uv python install 3.11.9
# 安装最新 3.11
uv python install 3.11
# 安装所有受支持的版本
uv python install 3.8 3.9 3.10 3.11 3.12 3.13
5.3 卸载版本
# 卸载指定版本
uv python uninstall 3.10
# 卸载多个版本
uv python uninstall 3.8 3.9
5.4 在项目中指定版本
在 pyproject.toml 中指定项目的 Python 版本要求:
[project]
name = "myproject"
version = "0.1.0"
requires-python = ">=3.11"
或者创建 .python-version 文件:
3.11
这样 uv sync 时会自动安装正确的 Python 版本。
5.5 实际使用场景
场景 1:维护多个项目
假设你有两个项目,一个需要 Python 3.11,另一个需要 Python 3.12:
# 项目 A(Python 3.11)
cd project-a
uv venv --python 3.11
uv pip install -r requirements.txt
# 项目 B(Python 3.12)
cd ../project-b
uv venv --python 3.12
uv pip install -r requirements.txt
两个项目使用不同的 Python 版本,互不影响。
场景 2:测试多版本兼容性
# 安装多个版本
uv python install 3.8 3.9 3.10 3.11 3.12
# 在每个版本下运行测试
for v in 3.8 3.9 3.10 3.11 3.12; do
uv venv --python $v test-env
.venv\Scripts\Activate.ps1
uv run pytest
deactivate
Remove-Item -Recurse -Force test-env
done
第六章:项目管理 —— 从初始化到运行
6.1 创建新项目
uv init 可以快速初始化新项目:
# 创建基础项目
uv init myproject
# 创建可打包项目(更完整的项目结构)
uv init --package myproject
# 创建库项目
uv init --lib mylibrary
# 创建脚本项目(单文件脚本)
uv init --script myscript.py
6.2 项目结构
uv init 会创建标准的 Python 项目结构:
myproject/
├── .python-version # Python 版本要求
├── pyproject.toml # 项目配置
├── README.md # 自述文件
├── src/
│ └── myproject/ # 源代码目录
│ ├── __init__.py
│ └── main.py
└── tests/
└── test_example.py # 测试文件
pyproject.toml 的内容:
[project]
name = "myproject"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = []
6.3 添加依赖
进入项目目录,添加依赖:
cd myproject
# 添加生产依赖
uv add requests
uv add "flask>=2.0"
uv add "numpy>=1.24"
# 添加开发依赖
uv add --dev pytest
uv add --dev black
uv add --dev ruff
# 添加可选依赖
uv add --optional gui pyqt6
添加后,pyproject.toml 会自动更新:
[project]
name = "myproject"
version = "0.1.0"
requires-python = ">=3.12"
dependencies = [
"requests>=2.28.0",
"flask>=2.0",
]
[project.optional-dependencies]
gui = ["pyqt6"]
[tool.uv]
dev-dependencies = [
"pytest>=7.0",
"black>=23.0",
]
6.4 运行项目
# 运行主程序
uv run python src/myproject/main.py
# 运行测试
uv run pytest
# 运行脚本
uv run python myscript.py
# 运行带参数的脚本
uv run python myscript.py --arg1 value1
6.5 锁定依赖
在团队协作中,锁定依赖版本很重要:
# 生成锁文件
uv lock
# 同步到锁文件
uv sync
# 升级依赖到最新兼容版本
uv lock --upgrade
# 升级特定包
uv lock --upgrade requests
uv lock 会生成 uv.lock 文件,这是项目的依赖锁文件,应该提交到版本控制系统。
6.6 完整的项目工作流
# 1. 创建项目
uv init myproject
cd myproject
# 2. 添加依赖
uv add flask requests
# 3. 添加开发依赖
uv add --dev pytest black ruff
# 4. 锁定依赖
uv lock
# 5. 在其他机器上同步
uv sync
这个工作流非常简洁,比使用多个工具(pip、pip-tools、poetry)组合要简单很多。
第七章:工具管理(uvx)—— 告别全局安装
7.1 什么是 uvx?
uvx 是 uv 的一个配套工具,类似于 Node.js 的 npx。它可以临时运行工具,而不需要全局安装。
7.2 运行常用工具
# 运行 black 代码格式化
uvx black .
# 运行 ruff 代码检查
uvx ruff check .
# 运行 ruff 格式化
uvx ruff format .
# 启动 Jupyter Lab
uvx jupyter lab
# 运行 httpie(HTTP 客户端)
uvx --from httpie http GET example.com
# 运行 mypy 类型检查
uvx mypy src/
# 运行 isort 导入排序
uvx isort src/
7.3 安装全局工具
如果你经常使用某个工具,可以全局安装它:
# 安装 black 为全局工具
uv tool install black
# 安装多个工具
uv tool install ruff
uv tool install pytest
uv tool install httpie
# 从 Git 安装
uv tool install --git https://github.com/psf/black black
# 从本地路径安装
uv tool install --path ./mytool mytool
7.4 管理已安装的工具
# 列出已安装的工具
uv tool list
# 输出示例:
# black v24.1.0
# ruff v0.1.0
# pytest v8.0.0
# 升级工具
uv tool upgrade black
# 升级所有工具
uv tool upgrade --all
# 卸载工具
uv tool uninstall black
7.5 工具来源
uv 支持多种工具来源:
# 从 PyPI 安装(默认)
uv tool install black
# 从 Git 仓库安装
uv tool install --git https://github.com/psf/black.git black
# 从 URL 安装
uv tool install --from-url https://example.com/tool.whl mytool
# 从本地文件安装
uv tool install --path ./tool.whl mytool
# 从特定版本安装
uv tool install --python 3.11 black
7.6 使用场景
场景 1:一次性工具
有些工具你可能只偶尔用一次,全局安装太浪费,uvx 就很合适:
# 用 httpie 调试 API
uvx --from httpie http POST api.example.com/items name=test
# 用 cowsay 玩一下
uvx --from cowsay cow "Hello from uvx"
场景 2:尝试新工具
想试试某个新工具,但不确定会不会长期使用:
# 先用 uvx 试试
uvx --from ruff-lsp ruff-lsp
# 觉得好用再全局安装
uv tool install ruff-lsp
场景 3:不同项目用不同版本
有时候不同的项目需要不同版本的工具:
# 项目 A 用新版本
uvx ruff@latest check .
# 项目 B 用稳定版本
uvx ruff@0.3.0 check .
第八章:实战案例 —— 我的日常开发工作流
8.1 场景一:快速创建数据分析环境
这是我的日常场景之一。假设我需要分析一批数据:
# 创建环境
uv venv --python 3.11 data-analysis
# 激活环境
.venv\Scripts\Activate.ps1
# 安装数据处理相关的包
uv pip install pandas numpy matplotlib seaborn jupyter
# 启动 Jupyter Lab
uv run jupyter lab
从创建环境到启动 Jupyter,整个过程不到 30 秒。
8.2 场景二:深度学习项目环境
深度学习项目通常需要较大的依赖包,安装时间长:
# 创建环境
uv venv --python 3.10 dl-project
# 激活环境
.venv\Scripts\Activate.ps1
# 安装 PyTorch(GPU 版本)
uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 安装其他常用包
uv pip install transformers datasets accelerate
# 安装开发依赖
uv pip install pytest pytest-cov black ruff
# 锁定依赖
uv lock
# 分享给队友时,队友只需要:
uv sync
8.3 场景三:Web API 开发
用 FastAPI 开发 REST API:
# 创建项目
uv init fastapi-demo --package
cd fastapi-demo
# 添加依赖
uv add fastapi uvicorn pydantic sqlalchemy
# 添加开发依赖
uv add --dev pytest httpx
# 创建应用代码(src/fastapi_demo/main.py)
# ...
# 运行开发服务器
uv run uvicorn src.fastapi_demo:app --reload
8.4 场景四:多项目维护
假设你有三个项目需要同时维护:
# 项目 1:Web 服务(Flask + Gunicorn)
cd web-service
uv run python -c "import flask; print(flask.__version__)"
# 项目 2:数据分析脚本
cd ../data-analysis
uv run python scripts/analysis.py
# 项目 3:CLI 工具
cd ../cli-tool
uv run mytool --help
每个项目有独立的虚拟环境和依赖,互不干扰。
8.5 对比我之前的 .NET 开发经验
我之前做过 .NET 开发,dotnet CLI 的工作流让我印象深刻:
# dotnet CLI 工作流
dotnet new webapi -n MyApi
cd MyApi
dotnet add package Microsoft.EntityFrameworkCore
dotnet run
# uv 工作流(几乎一样!)
uv init myapi --package
cd myapi
uv add fastapi uvicorn
uv run uvicorn src.myapi:app --reload
uv 的设计理念和 dotnet CLI 很相似:用统一的命令处理项目全生命周期。这种一致性让从 .NET 转向 Python 的开发者很容易上手。
8.6 完整的团队协作流程
假设你要和新队友协作开发项目:
# 1. 你初始化项目并锁定依赖
uv init team-project
cd team-project
uv add requests flask
uv lock
# 2. 提交到 Git
git add .
git commit -m "Initial project with dependencies"
# 3. 队友克隆项目
git clone https://github.com/team/team-project.git
cd team-project
# 4. 队友同步环境
uv sync
# 5. 队友开始开发
uv run python src/main.py
队友只需要一条 uv sync 命令,就能创建和你完全一致的开发环境。
第九章:进阶技巧与最佳实践
9.1 依赖组管理
uv 支持将依赖分组管理,这在大型项目中很有用:
# 添加开发依赖组
uv add --group dev pytest pytest-cov black ruff mypy
# 添加测试依赖组
uv add --group test httpx coverage
# 添加文档依赖组
uv add --group docs sphinx sphinx-rtd-theme
# 只同步特定组
uv sync --group dev # 只安装开发依赖
uv sync --group test # 只安装测试依赖
uv sync # 安装所有依赖(包括所有组)
# 从特定组卸载
uv remove --group dev black
在 pyproject.toml 中:
[tool.uv]
dev-dependencies = [
"pytest>=7.0",
"black>=23.0",
"ruff>=0.1.0",
"mypy>=1.0",
]
[tool.uv.group.test]
dependencies = [
"httpx>=0.24",
"coverage>=7.0",
]
9.2 依赖解析与锁定
uv 的依赖解析非常强大:
# 生成锁文件
uv lock
# 查看依赖树
uv tree
# 升级所有依赖到最新兼容版本
uv lock --upgrade
# 升级特定包
uv lock --upgrade numpy
# 查看可升级的包
uv pip list --outdated
9.3 缓存管理
uv 会缓存下载的包以加快后续安装:
# 查看缓存目录
uv cache dir
# 输出:C:\Users\用户名\AppData\Local\uv\Cache
# 清理所有缓存
uv cache clean
# 清理未使用的缓存
uv cache prune
# 设置自定义缓存目录
$env:UV_CACHE_DIR = "D:\uv-cache"
9.4 离线环境
场景 1:从目标目录安装
# 在有网环境下载包到目录
uv pip install requests numpy --target ./packages
# 在无网环境安装
uv pip install --offline --target ./packages requests numpy
场景 2:从 wheel 文件安装
# 在有网环境构建 wheel
uv pip wheel requests numpy
# wheel 文件会保存到当前目录
ls *.whl
# 在无网环境安装
uv pip install requests-*.whl numpy-*.whl
9.5 环境变量配置
uv 支持多种环境变量:
# 指定默认 Python 版本
UV_PYTHON=3.11
# 指定缓存目录
UV_CACHE_DIR=/path/to/cache
# 禁用进度条(CI 环境有用)
UV_NO_PROGRESS=1
# 并行下载数量
UV_CONCURRENT_DOWNLOADS=50
# 超时时间(秒)
UV_HTTP_TIMEOUT=300
# 代理设置
UV_HTTP_PROXY=http://proxy:8080
UV_HTTPS_PROXY=http://proxy:8080
9.6 使用配置文件
你可以在项目根目录创建 uv.toml 进行配置:
# uv.toml
python-version = "3.11"
# 索引 URL(使用国内镜像加速)
index-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
# 严格模式(不兼容的依赖会报错)
resolution = "strict"
# 预发布版本
prerelease = "allow"
使用清华镜像加速(国内用户):
index-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
9.7 与 Docker 配合使用
在 Dockerfile 中使用 uv:
# 使用官方 Python 镜像
FROM python:3.12-slim
# 安装 uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
WORKDIR /app
# 复制依赖文件
COPY pyproject.toml uv.lock ./
# 创建虚拟环境并安装依赖(层缓存优化)
RUN uv sync --frozen --no-install-project --no-dev
# 安装项目本身和开发依赖
RUN uv sync --frozen
# 设置启动命令
CMD ["uv", "run", "python", "src/main.py"]
第十章:总结与资源
10.1 uv 的核心优势
经过这段时间的使用,我总结出 uv 的几大优势:
| 优势 | 说明 | 对比工具 |
|---|---|---|
| 极速 | 比 pip 快 10-100 倍 | pip |
| 统一 | 一个工具替代六个 | pip, conda, poetry, pyenv, virtualenv, pipx |
| 轻量 | 几 MB vs 几百 MB | conda |
| 现代 | 符合 PEP 标准,支持 PEP 621 | poetry |
| 可靠 | 来自 Astral 公司,ruff 的开发者 | - |
| 简单 | 命令简洁,容易上手 | conda |
10.2 迁移指南
从 pip 迁移
uv 的 pip 子命令和 pip 完全兼容,你可以直接替换:
# 替代 pip install
uv pip install requests
# 替代 pip uninstall
uv pip uninstall requests
# 替代 pip freeze
uv pip freeze > requirements.txt
# 替代 pip list
uv pip list
从 conda 迁移
# 替代 conda create
uv venv --python 3.11
# 替代 conda activate
.venv\Scripts\Activate.ps1
# 替代 conda install
uv pip install requests
# 替代 conda env export
uv pip freeze > requirements.txt
迁移非常简单,不需要改变任何工作习惯。
10.3 常见问题
Q: uv 会和 pip 冲突吗?
不会。uv 只是 pip 的替代品,不影响 pip 的使用。你可以在同一个项目中同时使用 pip 和 uv(虽然不推荐)。
Q: 我的现有项目能用 uv 吗?
能。直接在项目目录使用 uv pip install -r requirements.txt 即可,uv 兼容 pip 的所有功能。
Q: uv 支持 Windows 吗?
完全支持,而且在 Windows 上性能很好。
Q: uv 支持 Linux/macOS 吗?
支持。uv 支持所有主流平台。
Q: uv 支持私有仓库吗?
支持。你可以通过 --index-url 或配置文件指定私有 PyPI 仓库:
[[tool.uv.index]]
url = "https://private.pypi.org/simple/"
Q: uv 能管理全局 Python 环境吗?
可以,但不推荐。uv 主要用于项目级别的环境管理。全局 Python 建议使用系统包管理器或 pyenv。
10.4 学习资源
官方资源
- 官方文档:https://docs.astral.sh/uv/
- GitHub 仓库:https://github.com/astral-sh/uv
- Discord 社区:https://discord.gg/astral-sh
社区资源
- Blog:https:// astral.sh/blog/
- Twitter:@astral_sh
- GitHub Discussions
10.5 结束语
使用 uv 几个月来,我的 Python 开发体验提升显著。以前要等几十秒的包安装,现在几秒搞定;以前要管理 pip、conda、virtualenv 多个工具,现在一个 uv 全部搞定。
如果你还在用 pip 或 conda,我强烈建议你试试 uv。它不会改变你的工作方式,但会让你的工作快很多。
当然,工具没有最好的,只有最适合的。uv 适合你,就用;不适合,继续用 pip 也没问题。重要的是找到适合自己的工作方式。
附录:命令速查表
安装与配置
| 操作 | 命令 |
|---|---|
| 安装 uv(PowerShell) | irm https://astral.sh/uv/install.ps1 | iex |
| 安装 uv(scoop) | scoop install uv |
| 安装 uv(macOS) | brew install uv |
| 安装 uv(Linux) | curl -LsSf https://astral.sh/uv/install.sh | sh |
| 查看版本 | uv --version |
虚拟环境
| 操作 | 命令 |
|---|---|
| 创建环境 | uv venv |
| 创建指定版本环境 | uv venv --python 3.11 |
| 激活环境(PowerShell) | .venv\Scripts\Activate.ps1 |
| 激活环境(Bash) | source .venv/Scripts/activate |
| 退出环境 | deactivate |
包管理
| 操作 | 命令 |
|---|---|
| 安装包 | uv pip install requests |
| 安装多包 | uv pip install requests numpy |
| 指定版本 | uv pip install "requests>=2.28" |
| 从文件安装 | uv pip install -r requirements.txt |
| 卸载包 | uv pip uninstall requests |
| 列出已安装 | uv pip list |
| 导出依赖 | uv pip freeze > requirements.txt |
| 同步依赖 | uv pip sync requirements.txt |
| 升级包 | uv pip install --upgrade requests |
Python 版本
| 操作 | 命令 |
|---|---|
| 列出版本 | uv python list |
| 安装版本 | uv python install 3.12 |
| 卸载版本 | uv python uninstall 3.10 |
项目管理
| 操作 | 命令 |
|---|---|
| 初始化项目 | uv init myproject |
| 添加依赖 | uv add requests |
| 添加开发依赖 | uv add --dev pytest |
| 锁定依赖 | uv lock |
| 同步依赖 | uv sync |
| 运行脚本 | uv run python script.py |
| 运行测试 | uv run pytest |
工具管理
| 操作 | 命令 |
|---|---|
| 临时运行工具 | uvx black . |
| 安装全局工具 | uv tool install black |
| 列出工具 | uv tool list |
| 升级工具 | uv tool upgrade black |
| 卸载工具 | uv tool uninstall black |
缓存
| 操作 | 命令 |
|---|---|
| 查看缓存目录 | uv cache dir |
| 清理缓存 | uv cache clean |
| 清理未使用缓存 | uv cache prune |
写作日期:2026 年 4 月 23 日
作者:刘航宇
参考链接:
评论交流
欢迎留下你的想法