UV是一个现代化、高性能的Python包管理器和安装工具,由Rust语言编写2。它被设计为传统Python包管理工具(如pip)的直接替代品,提供显著的速度、可靠性和依赖解析改进2。
UV的主要特点
UV与其他工具的比较
与pip和virtualenv相比,UV提供了:
更快的包安装和依赖解析速度
集成的环境管理功能
更清晰的错误信息和更好的冲突解决能力
更好的可重现性2
UV的主要功能
包管理
uv pip install
:安装包uv pip compile
:锁定依赖uv pip sync
:同步环境4
虚拟环境管理
工具运行
UV提供了两种特殊接口来管理命令行工具:
这些命令在UV缓存中创建临时虚拟环境,安装并运行请求的工具,无需将它们安装到项目的虚拟环境中237。
全局工具安装
UV代表了Python包管理的新一代工具,旨在解决Python生态系统中的常见痛点,如安装时间慢、依赖冲突和环境管理复杂性2。它作为一个统一且模块化的工具,可以替代多个传统工具,简化Python开发工作流程4。
Citations
- https://github.com/camel-ai/owl.git
- https://www.datacamp.com/tutorial/python-uv
- https://docs.astral.sh/uv/reference/cli/
- https://astral.sh/blog/uv
- https://mathspp.com/blog/using-uv-to-build-and-install-python-cli-apps
- https://www.saaspegasus.com/guides/uv-deep-dive/
- https://docs.astral.sh/uv/guides/tools/
- https://flocode.substack.com/p/044-python-environments-again-uv
Answer from Perplexity: pplx.ai/share
他什么时候开始流行的? 是不是语法和pip一样?
UV于2024年2月中旬首次发布,作为pip和pip-tools的替代品2。自发布以来,它迅速获得了广泛的流行,截至2024年中期,每月下载量已达到1600万次,占PyPI请求的10%以上5。到2025年初,UV已经成为Python社区中广受推崇的包管理工具,许多开发者开始从pip迁移到UV13。
UV的语法设计为与pip兼容,大多数常见的pip命令可以直接替换使用。例如,可以将pip install
替换为uv pip install
4。UV被设计为pip和pip-tools工作流程的”直接替代品”,这意味着现有的pip用户可以在不对其包管理工作流程进行重大更改的情况下切换到UV4。
然而,UV并不是pip的完全克隆,它不支持pip的所有命令行选项和子命令,尽管它支持大部分常用功能4。此外,UV不读取pip特定的配置文件或环境变量(如pip.conf或PIP_INDEX_URL),而是使用自己的环境变量(如UV_INDEX_URL)和配置文件(uv.toml或pyproject.toml中的[tool.uv.pip]部分)4。
在处理某些特定情况时,UV和pip也有一些行为差异,例如在处理存在于多个索引上的包时,UV会按顺序迭代索引并在找到匹配项后停止搜索,而pip会合并所有索引中的候选版本4。
Citations
- https://blog.det.life/changing-package-manager-from-pip-to-uv-81ac3b5a037d
- https://astral.sh/blog/uv
- https://www.datacamp.com/tutorial/python-uv
- https://docs.astral.sh/uv/pip/compatibility/
- https://www.janestreet.com/tech-talks/uv-an-extremely-fast-python-package-manager/
- https://astral.sh/blog/uv-unified-python-packaging
- https://dev.to/astrojuanlu/python-packaging-is-great-now-uv-is-all-you-need-4i2d
- https://thedataquarry.com/blog/towards-a-unified-python-toolchain
- https://www.reddit.com/r/Python/comments/1aroork/announcing_uv_python_packaging_in_rust/
- https://news.ycombinator.com/item?id=42676432
Answer from Perplexity: pplx.ai/share
Uv怎么管理包? 是不是也是用requirements.txt或者pyproject.toml
UV是一个现代化的Python包管理器,它支持两种主要的依赖管理方式:传统的requirements.txt和更现代的pyproject.toml。
UV的依赖管理方式
使用pyproject.toml(推荐方式)
UV主要使用pyproject.toml作为项目的配置文件,这是一个符合PEP 621标准的现代Python项目配置方式5。当使用UV管理项目时:
pyproject.toml文件定义项目的主要依赖关系(类似于pip-tools中的requirements.in)
使用pyproject.toml的基本工作流程:
bash
# 初始化项目 uv init myproject cd myproject # 添加依赖 uv add requests pandas # 同步环境(其他开发者克隆项目后使用) uv sync
使用requirements.txt(兼容传统方式)
UV完全兼容传统的requirements.txt文件,可以直接使用以下命令安装依赖47:
bash
# 安装requirements.txt中的依赖 uv pip install -r requirements.txt
从requirements.txt迁移到pyproject.toml
如果你想从传统的requirements.txt迁移到现代的pyproject.toml,UV提供了简便的迁移方式7:
bash
# 初始化项目 uv init --no-sample # 导入现有requirements.txt uv add -r requirements.txt # 导入开发依赖 uv add --dev -r requirements-dev.txt
UV的依赖管理特点
自动环境管理:UV自动创建和管理虚拟环境,无需手动激活3
高效缓存系统:UV使用全局缓存来最小化冗余,确保相同的包只存储一次,无论有多少项目需要它6
环境同步:
uv sync
命令会比较当前环境与依赖文件的差异,安装缺失的依赖,升级/降级版本,删除不需要的包6
UV代表了Python包管理的新一代工具,旨在解决传统包管理的痛点,如安装速度慢、依赖冲突和环境管理复杂等问题,同时保持与现有Python工具和工作流程的兼容性。
Citations
- https://www.datacamp.com/tutorial/python-uv
- https://paiml.com/blog/2024-12-01-uv-architecture/
- https://pydevtools.com/blog/requirementstxt-vs-pyprojecttoml/
- https://stackoverflow.com/questions/79344035/how-to-add-requirements-txt-to-uv-environment
- https://www.saaspegasus.com/guides/uv-deep-dive/
- https://flocode.substack.com/p/044-python-environments-again-uv
- https://pydevtools.com/handbook/how-to/migrate-requirements.txt/
- https://docs.astral.sh/uv/concepts/projects/layout/
- https://www.youtube.com/watch?v=JtR7EyMcaWU
- https://www.janestreet.com/tech-talks/uv-an-extremely-fast-python-package-manager/
- https://www.reddit.com/r/learnpython/comments/1j2bg8e/utility_to_convert_requirementstxt_to_uv/
Answer from Perplexity: pplx.ai/share
那我用UV运行程序和用venv有什么不一样? 实际命令的区别
使用UV运行Python程序与传统的venv方式相比有几个关键区别。
环境创建和管理
创建虚拟环境
UV方式:
uv venv [PATH]
或uv venv --python 3.12
传统venv方式:
python -m venv [PATH]
或virtualenv -p python3.12 [PATH]
UV创建虚拟环境更快,并且如果指定的Python版本不存在,UV会自动下载安装该版本24。
安装依赖
UV方式:
uv pip install <packages>
或uv add <packages>
传统方式:
pip install <packages>
UV的安装速度比传统pip快10-100倍,特别是在大型项目中1。
运行程序
直接运行脚本
UV方式:
uv run hello.py
传统方式:
python hello.py
(需要先激活环境:source .venv/bin/activate
)
UV不需要手动激活虚拟环境就能运行脚本,它会自动检测和使用项目目录或父目录中的.venv
环境15。
运行工具和命令
UV方式:
uv tool run black hello.py
或更简洁的uvx black hello.py
传统方式:需要先激活环境,然后直接运行
black hello.py
UV的工具运行机制会在缓存中创建临时虚拟环境,安装并运行请求的工具,无需将它们安装到项目的虚拟环境中1。
环境同步
UV方式:
uv sync
会比较当前环境与依赖文件的差异,安装缺失的依赖传统方式:
pip install -r requirements.txt
只会安装文件中的依赖,不会移除多余的包
自动化特性
UV提供了更多自动化功能:
自动创建虚拟环境(当添加第一个依赖时)
自动被VS Code识别(
.venv
文件夹位于项目根目录)使用全局缓存重用包,加速安装过程3
总的来说,UV提供了更现代、更快速、更集成的Python环境和包管理体验,减少了手动步骤,简化了工作流程。
Citations
- https://www.datacamp.com/tutorial/python-uv
- https://stackoverflow.com/questions/1534210/use-different-python-version-with-virtualenv
- https://flocode.substack.com/p/044-python-environments-again-uv
- https://docs.astral.sh/uv/reference/cli/
- https://docs.astral.sh/uv/pip/environments/
- https://www.reddit.com/r/learnpython/comments/1dq5zor/how_to_use_venv_in_vscode_to_run_python_scripts/
- https://www.youtube.com/watch?v=zgSQr0d5EVg
- https://treyhunner.com/2024/12/lazy-self-installing-python-scripts-with-uv/
Answer from Perplexity: pplx.ai/share
实践
1 | pip install uv |
Package Project
在pyproject.toml中加入
1 | [project.scripts] |
然后用 uv build就可以打包成whl
本地就可以用uv安装whl
可以用uv tool install xxx.whl
或者 uv add xxx.whl
Uv一般流程
https://www.cnblogs.com/wang_yb/p/18635441
好的,我已经仔细阅读了你提供的这篇关于 uv
的最新文章(写于2025年4月,介绍了截至2024年12月的功能)。现在,我将根据这篇文章的内容,为你重新组织一份完整、清晰的 Python 包管理方法论,并用中文回答。
使用 uv
的现代 Python 包管理方法论 (依据提供文章)
uv
旨在提供一个快速、统一、类似 Cargo
(Rust 的包管理器) 的 Python 包管理体验。以下是基于文章描述的推荐工作流程:
核心文件:
pyproject.toml
: 项目的 配置文件。由 用户定义和编辑,用于声明项目的元数据(名称、版本、描述等)、所需的 Python 版本以及 直接依赖项。可以区分不同的依赖组(例如开发依赖、生产依赖)。这是项目依赖的 意图 来源。uv.lock
: 项目的 锁文件。由uv
自动生成和管理,记录了项目所有依赖项(包括直接依赖和间接依赖)的 精确版本和来源。目的是确保在任何不同环境下安装依赖时都能获得完全一致的结果,保证可重复性。用户不应手动编辑此文件。
方法论步骤:
1. 初始化项目 (uv init
)
- 目的: 创建一个新的 Python 项目结构,并使用
uv
进行管理。 - 操作:bash
1
2uv init <你的项目名称> # 例如: uv init my-cool-project
cd <你的项目名称> - 结果:
uv
会创建一个包含以下基本文件的项目目录:pyproject.toml
: 包含项目基本信息和空的依赖列表。你需要在这里声明你的直接依赖。.gitignore
: 预设的 Git 忽略文件。.python-version
: 指定项目使用的 Python 版本。hello.py
/README.md
: 示例文件,可以替换或删除。- 项目会自动初始化为 Git 仓库。
2. 同步环境与依赖 (uv sync
)
- 目的: 这是项目设置和保持环境一致性的 核心命令。它执行多项任务:
- 查找或下载
pyproject.toml
(或.python-version
) 中指定的兼容 Python 版本。 - 在项目根目录下创建或更新虚拟环境 (
.venv
)。 - 首次运行时:读取
pyproject.toml
,解析所有依赖(包括间接依赖),并将精确版本信息写入uv.lock
文件。 - 后续运行时:读取
uv.lock
文件。 - 将虚拟环境 (
.venv
) 中的包与uv.lock
文件中定义的 精确状态同步 (安装缺失的、卸载多余的、更新/降级版本不符的)。
- 查找或下载
- 操作: 在项目根目录下运行:bash
1
uv sync
- 关键点:
- 新项目克隆下来后,第一步就应该是运行
uv sync
来创建环境并安装所有锁定的依赖。 - 当
uv.lock
文件更新后(例如,通过git pull
或uv add/remove
),运行uv sync
来使本地环境与锁文件保持一致。
- 新项目克隆下来后,第一步就应该是运行
3. 管理依赖 (uv add
/ uv remove
)
- 目的: 添加或移除项目的依赖项,并自动更新配置文件、锁文件和虚拟环境。
操作:
添加运行时依赖:
bash1
uv add <包名> # 例如: uv add requests fastapi
这会自动将
requests
和fastapi
添加到pyproject.toml
的[project.dependencies]
(或者根据文章示例,可能添加到[dependency-groups].production
,具体行为需关注uv
版本更新),更新uv.lock
,并将这些包及其依赖安装到.venv
中。添加开发依赖 (或其他组):
bash1
uv add --group dev <包名> # 例如: uv add --group dev pytest ruff
这会将
pytest
和ruff
添加到pyproject.toml
的[dependency-groups].dev
部分,更新uv.lock
,并将它们安装到.venv
中。移除依赖:
bash1
uv remove <包名> # 例如: uv remove pandas
这会从
pyproject.toml
(如果存在于相应部分) 和uv.lock
中移除pandas
及其不再需要的间接依赖,并从.venv
中卸载它们。
关键点: 使用
uv add
和uv remove
是管理依赖的首选方式,因为它们能自动处理pyproject.toml
、uv.lock
和.venv
的一致性。
4. 在虚拟环境中运行代码 (uv run
)
- 目的: 在
uv
管理的、包含正确依赖的虚拟环境中执行 Python 脚本或任何命令。 - 操作:bash
1
2
3uv run python your_script.py
uv run pytest # 运行安装在 dev 组的 pytest
uv run uvicorn main:app --reload # 运行 uvicorn - 优势: 无需手动激活 (
source .venv/bin/activate
) 虚拟环境,uv run
会自动确保命令在正确的环境中执行。
5. 工作流程总结与版本控制
- 初始化:
uv init myproject && cd myproject
- 添加依赖:
uv add requests
(生产依赖)uv add --group dev pytest
(开发依赖)
- 同步/安装: (通常
uv add
会自动同步,但如果手动修改pyproject.toml
或拉取代码后需要)uv sync
- 编码与测试: 编写代码,使用
uv run python main.py
或uv run pytest
等运行。 - 提交: 将
pyproject.toml
和uv.lock
文件提交到 Git。uv.lock
文件必须提交,以保证团队成员和 CI/CD 环境的一致性。.venv
目录通常添加到.gitignore
中,不提交。 - 新环境设置: 其他人克隆仓库后,只需进入项目目录,运行
uv sync
即可创建完全一致的开发环境。
与 requirements.txt
的关系
根据这篇文章描述的 uv
工作流,pyproject.toml
用于声明直接依赖,uv.lock
用于锁定所有依赖。传统的 requirements.txt
文件在这个流程中不是必需的核心部分。
uv
可以读取requirements.txt
文件进行安装 (uv pip install -r requirements.txt
),以兼容旧项目或特定场景。uv
也可以生成requirements.txt
格式的文件 (uv pip freeze > requirements.txt
),用于需要这种格式的部署流程或工具。
但对于使用 uv
进行现代包管理的项目,推荐主要依赖 pyproject.toml
和 uv.lock
。
这份基于你提供文章的方法论应该能清晰地指导你如何使用 uv
来管理你的 Python 项目。它强调了 pyproject.toml
作为用户配置入口、uv.lock
作为机器管理的锁文件、以及 uv sync
作为环境同步核心命令的角色。
https://github.com/fpgmaas/cookiecutter-uv/blob/main/Makefile
这是个带uv的cookiecutter project template