uv:让Python包管理快如闪电
Python包管理迎来了重大升级。uv这个工具比pip快10到100倍,还能替代你所有的Python开发工具。它由Astral公司用Rust语言开发,正在快速成为Python开发的新标准。
为什么要从pip换成uv?
速度提升改变工作方式:
包装包安装:比pip快10-100倍
虚拟环境创建:比python -m venv快80倍
Streamlit Cloud改用uv后,部署时间减少了55%
一个工具替代多个工具:
可以替代pip、pip-tools、pipx、poetry、pyenv和virtualenv
单个可执行文件,不依赖Python环境
所有操作都使用统一的接口
安装方法
Linux或macOS系统推荐这样安装:
curl -LsSf https://astral.sh/uv/install.sh | sh用Homebrew安装:
brew install uv检查是否安装成功:
uv --version常用命令
Python版本管理:
uv直接管理Python安装,不需要pyenv或手动下载:
# 安装Python版本
uv python install 3.12
uv python install 3.11.9
# 查看可用版本
uv python list --all-versions
# 查看已安装版本
uv python list
# 为项目指定Python版本
uv python pin 3.12 # 创建.python-version文件
# 使用特定Python版本
uv venv --python 3.11
uv run --python 3.12 python script.py创建新项目:
# 用指定Python版本创建项目
uv init my-project --python 3.12
cd my-projectuv会自动创建:
pyproject.toml(现代Python项目标准配置)
.python-version(固定Python版本)
.gitignore
README.md
main.py
管理依赖包:
# 添加包(如果需要会自动创建虚拟环境)
uv add requests fastapi
# 添加开发依赖
uv add --dev pytest black ruff
# 更新包
uv sync --upgrade
# 移除包
uv remove unused-package运行代码:
不需要手动激活虚拟环境,uv会自动处理:
# 运行脚本
uv run python main.py
# 运行工具
uv run pytest
uv run black .
# 不全局安装直接运行工具
uvx ruff check . # 类似Node.js的npx从pip迁移到uv
| 你想做什么 | 旧方法(pip) | 新方法(uv) |
|---|---|---|
| 安装Python | pyenv install 3.12 | uv python install 3.12 |
| 创建虚拟环境 | python -m venv .venv | uv venv(或自动创建) |
| 用指定Python创建环境 | python3.11 -m venv .venv | uv venv --python 3.11 |
| 安装包 | pip install requests | uv add requests |
| 从requirements安装 | pip install -r requirements.txt | uv pip install -r requirements.txt |
| 运行脚本 | source .venv/bin/activate && python main.py | uv run python main.py |
| 用指定Python运行 | python3.11 script.py | uv run --python 3.11 python script.py |
| 安装全局工具 | pipx install black | uv tool install black |
实际例子:创建FastAPI项目
我们来建一个简单的API看看uv的实际使用:
# 1. 用Python 3.12创建项目
uv init weather-api --python 3.12
cd weather-api
# 2. 添加依赖
uv add fastapi uvicorn httpx
# 3. 创建main.py文件
cat > main.py << 'EOF'
from fastapi import FastAPI
import httpx
import sys
app = FastAPI()
@app.get("/")
async def root():
return {
"message": "使用uv构建的天气API!",
"python_version": sys.version
}
@app.get("/weather/{city}")
async def get_weather(city: str):
# 模拟天气数据
return {
"city": city,
"temperature": 22,
"condition": "sunny",
"powered_by": "uv"
}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
EOF
# 4. 运行API(自动使用Python 3.12)
uv run python main.py
# 5. 用不同Python版本测试
uv run --python 3.11 python main.py这样就完成了!不需要激活虚拟环境,不需要pip freeze,既快速又简单。
最佳实践
项目结构应该这样组织:
my-project/
├── pyproject.toml # 项目配置
├── .python-version # Python版本
├── uv.lock # 锁定文件,提交到代码库
├── src/
│ └── my_project/
└── tests/Python版本策略:
# 库项目 - 支持多个版本
uv init my-lib --python ">=3.9"
# 应用项目 - 固定特定版本
uv init my-app --python 3.12
uv python pin 3.12
# 用多个Python版本测试
uv run --python 3.10 pytest
uv run --python 3.11 pytest
uv run --python 3.12 pytest依赖管理:
# 合理使用版本约束
uv add 'django>=4.0,<5.0' # 保证兼容性
uv add 'numpy==1.24.3' # 固定关键依赖版本
# 按用途分组
uv add --dev pytest mypy # 开发工具
uv add --group docs sphinx # 可选分组在GitHub Actions中使用:
name: Test
on: [push]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v5
- run: uv python install ${{ matrix.python-version }}
- run: uv sync --locked
- run: uv run pytest常见问题解决
不要手动激活虚拟环境:
# ❌ 旧习惯
source .venv/bin/activate
python main.py
# ✅ 让uv处理
uv run python main.py从项目根目录运行:
# ❌ 可能导致导入问题
cd src && python ../scripts/test.py
# ✅ 始终从根目录运行
uv run python scripts/test.py缓存管理:
# 查看缓存大小
uv cache info
# 定期清理
uv cache clean2024-2025新特性
跨平台锁文件,保证环境一致性
内置Python版本管理
保持所有操作10-100倍的性能优势
GitHub上有55,000+星标,采用率快速上升
官方PyCharm支持和生态持续完善
你应该切换吗?
如果你想要这些好处,就应该切换:
依赖安装速度大幅提升
项目管理更简单
一个工具替代多个工具
现代化的Python开发体验
可以从这些场景开始:
新项目(无需迁移)
CI/CD流水线(大幅节省时间)
开发环境(立即提升效率)
Python生态正在快速接纳uv作为下一代标准。现在开始使用,意味着加入一个正在体验Python包管理未来的成长社区。
开始使用建议
对于个人项目,直接开始使用uv。你会立即感受到速度的提升。
对于团队项目,可以先在CI/CD环境中试用,验证效果后再推广到开发环境。
对于现有项目,uv可以与传统工具共存,逐步迁移。
uv代表了Python工具发展的方向:更快、更简单、更统一。它解决了Python开发中的很多痛点,特别是依赖安装速度和环境管理复杂度问题。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!