qidao123.com技术社区-IT企服评测·应用市场

标题: uv全功能更新:统一管理Python项目、工具、脚本和环境的终极办理方案 [打印本页]

作者: 大连密封材料    时间: 2025-5-6 22:26
标题: uv全功能更新:统一管理Python项目、工具、脚本和环境的终极办理方案
花下猫语:uv 项目自发布起就大受欢迎,现在 Github star 52.6 K,远超过它的同类竞品们。前不久,它的创始人在 X 上披露了一组惊人的数据:uv 曾占据了 PyPI 超过 20% 的流量,用户每天通过它发起约 4-5 亿次下载请求!

我在去年翻译过 uv 首发时的新闻文章,根据博客后台不完整的统计,从 Google 搜索进入的访问量已经超过 3000,妥妥成为了我博客的搜索访问 TOP 1!这侧面也反映出 uv 的火爆水平!
uv 刚过一周岁不久,如此年轻,结果斐然啊。趁着这波热点(实际是假期偶然间),我抽闲把 uv 紧张版本更新的文章也翻译出来了,enjoy reading~
作者:@charliermarsh
译者:豌豆花下猫@Python猫
英文:uv: Unified Python packaging (https://astral.sh/blog/uv-unified-python-packaging)
声明:本翻译是出于交流学习的目的,为便于阅读,部门内容略有改动。转载请保留作者信息。
简述: uv 是一个用 Rust 开辟的超高性能 Python 包管理器。
我们最初在 2 月份发布了 uv,作为常见 pip 工作流的即插即用替换方案。(译注:uv 在 2024.02 发布,本文写于 2024.08,翻译于 2025.05)
今天,我们发布一系列新功能,这些功能将 uv 从一个 pip 替换品扩展成为一个端到端的办理方案,可用于管理 Python 项目、命令行工具、单文件脚本,乃至 Python 自己。
它就像是 Python 世界的Cargo:提供了一个快速、可靠且易用的统一接口。
在 Astral,我们致力于为 Python 生态系统打造高性能的开辟工具。我们最知名的产品是 Ruff,一个超高速的 Python 代码检查器格式化工具
在 2 月份,我们发布了 uv,这是一个极快的 Python 包安装器和依赖解析器,最初计划为常见 pip 工作流的即插即用替换方案。
今天,我们宣布 uv 自首次发布以来最大规模的功能扩展:
...全部功能背后都是一个跨平台的超高速依赖解析器在支持。

上图展示了启用全部可选依赖项时解析 Transformers 项目的速度对比:上方无缓存状态,下方启用了缓存。
并且全部功能都包含在新的、全面的文档中。
这些新功能每一项都大大扩展了 uv 的能力范围。但更独特的是,它们组合起来形成了一个完整的工具链,大大简化了 Python 开辟过程。
联合 uv pip(我们将它作为一等功能,继续维护并改进),uv 适用于任何 Python 工作流,从一次性脚本到大型的多包工作区开辟。
你可以通过我们的独立安装步伐或从 PyPI 安装 uv:
curl
  1. curl -LsSf https://astral.sh/uv/install.sh | sh
复制代码
win
  1. powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
复制代码
pip
  1. pip install uv
复制代码
pipx
  1. pipx install uv
复制代码
项目

uv 如今可以全面管理 Python 项目了。如果你用过 PoetryPDMRye,那么 uv 的项目 API 对你来说肯定不生疏。
项目 API 基于 Python 标准构建,使用 pyproject.toml 来界说项目元数据。
比方,你可以运行 uv init && uv add "fastapi>=0.112" 天生以下内容:
  1. [project]
  2. name = "hello-world"
  3. version = "0.1.0"
  4. readme = "README.md"
  5. dependencies = ["fastapi>=0.112"]
复制代码
从它开始,uv 将基于项目的依赖项创建一个锁文件。以下是一个示例片段:
  1. [[package]]
  2. name = "fastapi"
  3. version = "0.112.1"
  4. source = { registry = "https://pypi.org/simple" }
  5. dependencies = [
  6.     { name = "pydantic" },
  7.     { name = "starlette" },
  8.     { name = "typing-extensions" },
  9. ]
  10. sdist = { url = "https://files.pythonhosted.org/packages/2c/09/71a961740a1121d7cc90c99036cc3fbb507bf0c69860d08d4388f842196b/fastapi-0.112.1.tar.gz", hash = "sha256:b2537146f8c23389a7faa8b03d0bd38d4986e6983874557d95eed2acc46448ef", size = 291025 }
  11. wheels = [
  12.     { url = "https://files.pythonhosted.org/packages/39/b0/0981f9eb5884245ed6678af234f2cbcd40f44570718caddc0360bdb4015d/fastapi-0.112.1-py3-none-any.whl", hash = "sha256:bcbd45817fc2a1cd5da09af66815b84ec0d3d634eb173d1ab468ae3103e183e4", size = 93163 },
  13. ]
  14. [[package]]
  15. name = "fastapi-cli"
  16. version = "0.0.5"
  17. source = { registry = "https://pypi.org/simple" }
  18. dependencies = [
  19.     { name = "typer" },
  20.     { name = "uvicorn", extra = ["standard"] },
  21. ]
  22. sdist = { url = "https://files.pythonhosted.org/packages/c5/f8/1ad5ce32d029aeb9117e9a5a9b3e314a8477525d60c12a9b7730a3c186ec/fastapi_cli-0.0.5.tar.gz", hash = "sha256:d30e1239c6f46fcb95e606f02cdda59a1e2fa778a54b64686b3ff27f6211ff9f", size = 15571 }
  23. wheels = [
  24.     { url = "https://files.pythonhosted.org/packages/24/ea/4b5011012ac925fe2f83b19d0e09cee9d324141ec7bf5e78bb2817f96513/fastapi_cli-0.0.5-py3-none-any.whl", hash = "sha256:e94d847524648c748a5350673546bbf9bcaeb086b33c24f2e82e021436866a46", size = 9489 },
  25. ]
复制代码
uv 的锁文件就像项目依赖关系的完整快照,它能确保项目在差别机器上的运行环境保持一致。
这个锁文件最大的优势是跨平台。不管你在哪个系统上天生锁文件,它都能在别的平台上正常工作。uv 为每个平台界说了一个独特的办理方案,天生一个可读且可审计的锁文件,精确地界说了将安装哪些软件包。
比方:如果你在 macOS 上运行 uv lock,uv 仍然会为 Linux 和 Windows 天生解析方案,即使每个平台上所需的依赖集稍有差别。
而且它做得非常快。在没有任何缓存的环境下,uv 可以在大约半秒钟内解析 Jupyter 项目的依赖项(在缓存预热的环境下约为 20 毫秒)。

解析 Jupyter 项目时无缓存(上)和有缓存(下)的对比。
项目 API 的核心是 uv run 命令,它能在项目专属环境中运行命令,而且不必要手动激活虚拟环境。
uv run 非常快速。每次执行时,它都会自动重新锁定和同步项目,确保你的环境始终是最新状态。完全不必要手动干预。
换句话说,uv run 能确保你的命令每次都在一个一致的、受锁文件管理的环境中运行。

使用 uv run 命令启动 FastAPI 应用的示例。
有了 uv run,你再也不必要操心虚拟环境的激活、依赖包的管理大概项目的维护更新。一切都变得无比简单。
想了解更多详情,请查阅项目文档
本文翻译并首发于 Python猫:uv:统一的 Python 包管理
依赖源:可编辑依赖、相对路径等

uv 基于 Python 标准构建,如 PEP 621。同时,它还添加了一些在标准中没有的功能,这些功能对当地开辟至关紧张,如相对路径和可编辑依赖。
在标准的 project.dependencies 部门,你可以界说项目的依赖和可发布的元数据。而在开辟过程中,uv 还允许你通过 tool.uv.sources 为这些依赖项指定替换泉源。
比方,要使用当地的、可编辑版本的 anyio,你可以运行 uv add --editable ../anyio 来天生以下 pyproject.toml:
  1. [project]
  2. name = "hello-world"
  3. version = "0.1.0"
  4. readme = "README.md"
  5. dependencies = ["anyio"]
  6. [tool.uv.sources]
  7. anyio = { path = "../anyio", editable = true }
复制代码
当发布到 PyPI 时,上述包会声明对anyio 的依赖。但在当地开辟时,使用 uv run 可以将 ../anyio 路径下的可编辑的包加到开辟环境中。如许,项目的依赖界说保持稳定,只是依赖的泉源发生了变化。
具体内容请查阅依赖源文档
工作区

Cargo 相同概念的启发,uv 支持工作区:一组管理在一起的包的集合。
想象如许一个场景:在同一个 Git 仓库中,有一个使用 FastAPI 构建的 Web 应用,还有多个作为独立 Python 包开辟和维护的库。
大多数大型 Python 项目终极都会用自己的方式来实现这个概念,它们通常借助手写脚本和自界说工具来管理各个包之间的关系。
uv 的工作区 API 为大规模开辟中的各种挑衅提供了一致、高效且具有创新性的办理方案。
在工作区中,每个包都有自己的 pyproject.toml,但工作区共享一个锁文件,确保工作区使用一致的依赖集运行。
  1. [project]
  2. name = "fastapi"
  3. version = "0.1.0"
  4. readme = "README.md"
  5. dependencies = ["uvicorn"]
  6. [tool.uv.sources]
  7. uvicorn = { workspace = true }
  8. [tool.uv.workspace]
  9. members = ["libraries/*"]
复制代码
在工作区的根目录下,你可以运行命令来操作任何工作区包。比方,执行 uv run --package fastapi 或 uv run --package uvicorn。
更多细节,请查阅工作区文档
本文翻译并首发于 Python猫:(https://pythoncat.top/posts/2025-05-05-uv)
工具

uv 如今有两种新能力:
如果你使用过 pipxnpx,你会发现 uv 的工具 API 很认识。
比如,输入 uvx posting 就能直接运行 Darren Burns 开辟的 posting 终端界面步伐(TUI)。

使用 uvx 命令在终端中运行 posting 的示例。
工具 API 让你能集中管理系统上的 Python 工具。你可以:
uv 的工具 API 非常快,通过 uvx 执行命令几乎没有任何额外开销。
更多工具功能,请查阅工具文档
Python 引导安装

uv 如今能够安装和管理 Python 自己,使其完全自引导:
  1. $ curl -LsSf https://astral.sh/uv/install.sh | sh
  2. $ uv python install 3.12
复制代码
如果你的机器上没有安装 Python,大概缺少特定的、所需的 Python 版本,除了显式调用 uv python 外,uv 还可以根据必要,自动下载所需的 Python 版本(如 uv run、uv venv 等命令)。
比方,以下是在新的 Ubuntu Docker 镜像上运行 posting 所需的全部命令,没有任何隐藏步调:
  1. $ apt-get update && apt-get install -y curl
  2. $ curl -LsSf https://astral.sh/uv/install.sh | sh
  3. $ source $HOME/.cargo/env
  4. $ uvx posting
复制代码
当你运行 uvx 命令时,uv 会一步到位地完成全部工作:
整个过程无缝衔接,高效快捷。
单文件脚本

最后:uv 如今提供了对单文件 Python 脚本的一等支持,这些脚本可以内嵌依赖元数据,完全符合 PEP-723 标准。
比方,以下文件 main.py,它从 Python 增强提案索引中获取前 10 个 PEP:
  1. import requests
  2. from rich.pretty import pprint
  3. resp = requests.get("https://peps.python.org/api/peps.json")
  4. data = resp.json()
  5. pprint([(k, v["title"]) for k, v in data.items()][:10])
复制代码
这个脚本依赖requests 和 rich,但不包含任何显式的依赖元数据。早些时间,你必要单独管理这些依赖项,比方使用专门的 requirements.txt 文件。
如今,你可以使用 uv add 自动将依赖声明嵌入到脚本中:
[code]$ uv add --script main.py "requests=3.12"# dependencies = [#     "requests




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4