Python 包管理生态中存在多种工具,如 pippip-toolspoetryconda 等,各自具备一定功能。

而今天介绍的uvAstral 公司推出的一款基于 Rust 编写的 Python 包管理工具,旨在成为 “Python 的 Cargo”。

它提供了快速、可靠且易用的包管理体验,在性能、兼容性和功能上都有出色表现,为 Python 项目的开发和管理带来了新的选择。

1. 为什么用uv

与其他Python中的包管理工具相比,uv更像是一个全能选手,它的优势在于:

  1. 速度快:得益于Rustuv工具的速度让人惊艳,比如安装依赖,速度比其他工具快很多
  2. 功能全面uv 是“一站式服务”的工具,从安装 Python、管理虚拟环境,到安装和管理包,再到管理项目依赖,它统统都能处理得很好
  3. 前景光明:背后有风投公司Astral支持,且采用了MIT许可,即使未来出现问题,社区也有应对的办法

使用uv,也可以像NodeJS或者Rust项目那样方便的管理依赖。

2. 如何安装

安装 uv 非常简单,可以使用官方提供的安装脚本,也可以通过pip来安装。

# On macOS and Linux.
curl -LsSf https://astral.sh/uv/install.sh | sh # On Windows.
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" # With pip.
pip install uv

安装之后,可以通过uv help命令检查是否安装成功:

3. 如何使用

下面演示如何使用uv来管理Python项目。

使用uv之前,创建一个Python项目对我来说就是创建一个文件夹而已。

使用uv之后,终于有了一些项目的感觉,对于uv,我使用时间也不长,疏漏或错误的地方欢迎指正!

接下来,从创建一个项目开始,演示我使用uv时常用的一些功能。

首先,介绍uv工具主要使用的两个文件:

  • pyproject.toml:定义项目的主要依赖,包括项目名称、版本、描述、支持的 Python 版本等信息
  • uv.lock:记录项目的所有依赖,包括依赖的依赖,且跨平台,确保在不同环境下安装的一致性。这个文件由 uv 自动管理,不要手动编辑

3.1. 创建项目

接下来,创建一个项目,使用uv init <project dir>命令。

$  uv init myproject
Initialized project `myproject` at `D:\projects\python\myproject` $ cd .\myproject\ $ ls 目录: D:\projects\python\myproject Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2024/12/27 12:06:08 109 .gitignore
-a---- 2024/12/27 12:06:08 5 .python-version
-a---- 2024/12/27 12:06:08 87 hello.py
-a---- 2024/12/27 12:06:08 155 pyproject.toml
-a---- 2024/12/27 12:06:08 0 README.md

通过init创建项目之后,uv工具贴心地帮助我们生成了一些默认文件。

其中 hello.py 只是一段演示用的代码,

随后我们可以根据实际的项目需要删除这个代码文件,换成自己的实际代码。

$  cat .\hello.py
def main():
print("Hello from myproject!") if __name__ == "__main__":
main()

pyproject.toml中是一些项目信息:

$  cat .\pyproject.toml
[project]
name = "myproject"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = []

注意uv init 创建项目之后,会自动将项目使用Git来管理。

3.2. 操作环境

创建项目之后,我们进入项目根文件夹的第一件事就是同步项目依赖。

$  uv sync
Using CPython 3.12.4 interpreter at: D:\miniconda3\envs\databook\python.exe
Creating virtual environment at: .venv
Resolved 1 package in 15ms
Audited in 0.05ms

同步之后,会自动查找或下载合适的 Python 版本,创建并设置项目的虚拟环境,构建完整的依赖列表并写入

uv.lock 文件,最后将依赖同步到虚拟环境中。

我们这个是新创建的项目,没有什么依赖,所以uv.lock 文件中的内容也比较简单。

$  ls

    目录: D:\projects\python\myproject

Mode                 LastWriteTime         Length Name
---- ------------- ------ ----
d----- 2024/12/27 12:12:39 .venv
-a---- 2024/12/27 12:06:08 109 .gitignore
-a---- 2024/12/27 12:06:08 5 .python-version
-a---- 2024/12/27 12:06:08 87 hello.py
-a---- 2024/12/27 12:06:08 155 pyproject.toml
-a---- 2024/12/27 12:06:08 0 README.md
-a---- 2024/12/27 12:12:39 116 uv.lock $ cat .\uv.lock
version = 1
requires-python = ">=3.12" [[package]]
name = "myproject"
version = "0.1.0"
source = { virtual = "." }

uv sync同步之后,就可以运行项目的代码了。

既然使用uv管理项目的话,我们就使用uv的命令来运行代码,不要像以前那样使用python xxx.py来运行。

我们可以试着运行项目创建时自动生成的代码。

$  uv run .\hello.py
Hello from myproject!

3.3. 管理依赖

管理依赖是我使用uv工具的主要目的,使用uv添加依赖非常简单,和npmcargo差不多。

$  uv add pandas
Resolved 7 packages in 3.41s
Prepared 6 packages in 4.63s
Installed 6 packages in 1.80s
+ numpy==2.2.1
+ pandas==2.2.3
+ python-dateutil==2.9.0.post0
+ pytz==2024.2
+ six==1.17.0
+ tzdata==2024.2

尝试安装了一个pandas依赖(pandas依赖的包也自动安装了),从上面日志可以看出速度非常快。

这时再看看uv.lock 文件的变化。

$  cat .\uv.lock
version = 1
requires-python = ">=3.12" [[package]]
name = "myproject"
version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "pandas" },
] [package.metadata]
requires-dist = [{ name = "pandas", specifier = ">=2.2.3" }] [[package]]
name = "pandas"
version = "2.2.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "numpy" },
{ name = "python-dateutil" },
{ name = "pytz" },
{ name = "tzdata" },
] [[package]]
name = "pytz"
version = "2024.2"
source = { registry = "https://pypi.org/simple" }

上面的日志中我删除了很多内容,因为整体内容太多,详细记录了每个包以及它依赖的包的情况。

uv.lock这个文件我们不要手动去编辑它,使用uv工具去管理它。

引入了pandas之后,我们看看是否可以在hello.py中使用。

$  cat .\hello.py
import pandas as pd def main():
print("Hello from myproject!")
df = pd.DataFrame(
{
"A": [1, 2, 3],
"B": [4, 5, 6],
}
)
print(df) if __name__ == "__main__":
main() $ uv run .\hello.py
Hello from myproject!
A B
0 1 4
1 2 5
2 3 6

可以正常使用安装的包pandas,下面在试试删除依赖会怎么样。

$  uv remove pandas
Resolved 1 package in 12ms
Uninstalled 6 packages in 1.18s
- numpy==2.2.1
- pandas==2.2.3
- python-dateutil==2.9.0.post0
- pytz==2024.2
- six==1.17.0
- tzdata==2024.2 $ cat .\uv.lock
version = 1
requires-python = ">=3.12" [[package]]
name = "myproject"
version = "0.1.0"
source = { virtual = "." }

使用uv remove命令删除pandas包之后,也会自动删除pandas依赖的其他包,

我们看到uv.lock 文件也恢复到最初的内容。

再试试运行hello.py看看。

$  uv run .\hello.py
Traceback (most recent call last):
File "D:\projects\python\myproject\hello.py", line 1, in <module>
import pandas as pd
ModuleNotFoundError: No module named 'pandas'

果然,无法运行了。

3.4. 区分开发和生产环境

还有一个比较常用的功能是区分开发环境生产环境的依赖,这个功能在NodeJSRust中很常见。

比如,我们想把pandas安装到开发环境中,而把requests安装到生产环境中。

$  uv add --group dev pandas
Resolved 7 packages in 1.72s
Installed 6 packages in 1.39s
+ numpy==2.2.1
+ pandas==2.2.3
+ python-dateutil==2.9.0.post0
+ pytz==2024.2
+ six==1.17.0
+ tzdata==2024.2 $ uv add --group production requests
Resolved 12 packages in 2.72s
Prepared 5 packages in 1.31s
Installed 5 packages in 68ms
+ certifi==2024.12.14
+ charset-normalizer==3.4.1
+ idna==3.10
+ requests==2.32.3
+ urllib3==2.3.0

安装之后,uv.lock 文件自动添加了各个包及其依赖,这里不再赘述。

从项目的pyproject.toml中可以看出不同环境的包依赖。

$  cat .\pyproject.toml
[project]
name = "myproject"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [] [dependency-groups]
dev = [
"pandas>=2.2.3",
]
production = [
"requests>=2.32.3",
]

4. 未来发展

uv 也可以构建和发布 Python 包到 PyPi,具体细节本篇就不展开了。

uv 自从发布后,团队一直致力于优先提升其跨平台的兼容性、性能和稳定性,帮助用户顺利将项目过渡到使用uv来管理。

长远来看,uv 将发展成为一个完整的 Python 项目和包管理器,提供一站式的开发体验,涵盖从 Python 安装到项目管理的各个环节,进一步简化 Python 项目的开发流程,提高开发效率。

Python包管理不再头疼:uv工具快速上手的更多相关文章

  1. Python包管理工具小结

    此文已由作者张耕源授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 作为一名接触Python有一段时间的初学者,越来越体会到Python的方便之处,它使人能更 多的关注业务本身 ...

  2. python 包管理工具

    python 包管理工具 Python当前的包管理工具链是 easy_install/pip + distribute/setuptools + distutils,显得较为混乱. 而将来的工具链组合 ...

  3. Python 包管理工具解惑

    Python 包管理工具解惑 本文链接:http://zengrong.net/post/2169.htm python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到 ...

  4. Python包管理工具和多版本环境管理

    1. Python包管理工具 在安装Python包的过程中,经常涉及到distutils.setuptools.distribute.setup.py.easy_install.easy_instal ...

  5. 转载:Python 包管理工具解惑

    Python 包管理工具解惑 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文章提供m ...

  6. Python包管理工具pip的基本使用

    1.简介 pip 是一个Python包管理工具,主要是用于安装 PyPI 上的软件包,可以替代 easy_install 工具. 2.pip安装 如果你安装的Python 2 >=2.7.9 或 ...

  7. python包管理工具他们之间的关系

    python包管理工具之间的关系 现在的python包管理工具有很多,非常混乱,必须理清他们之间的关系才能更好的使用python构建强大的包关系系统工具. 首先:python官方推荐的第三方库是PyP ...

  8. Python | Pipenv官方推荐的python包管理工具

    原文地址:https://cloud.tencent.com/developer/article/1355672 Pipenv - 官方推荐的的python包管理工具. Pipenv是一款旨在将所有包 ...

  9. [转载]Python 包管理工具

    [转载]Python 包管理工具 最近由于机缘巧合,使用各种方法安装了一些Python包,所以对Python的包管理开始感兴趣.在网上找到一篇很好的文章:https://blog.zengrong.n ...

  10. python 包管理工具 pip 的配置

    近几年来,python的包管理系统pip 越来越完善, 尤其是对于 windows场景下,pip大大改善了python的易用性. https://www.cnblogs.com/yvivid/p/pi ...

随机推荐

  1. 云原生周刊:Meshery v0.70 发布 | 2024.1.22

    开源项目推荐 flux-cluster-template 该项目用于部署由 Flux.SOPS.GitHub Actions.Renovate.Cilium 等支持的 Kubernetes 集群,专注 ...

  2. 你在使用 KubeSphere 吗?

    如果你正在使用 KubeSphere,欢迎在社区分享你的使用和实践经验,赢取 KubeSphere 周边礼品(T恤.帆布袋.徽章等)以及 Kubernetes 技术书籍. 为什么我们要征集用户案例? ...

  3. 好上好信息 API 微服务集群在 KubeSphere 的部署实践

    作者:徐鹏.深圳好上好信息(001298).技术副总监.负责云服务器团队的架构设计及业务开发,拥抱云原生,乐于分享,终生学习. 公司简介 好上好信息(001298)是中国大陆一家致力于为中国智造提供全 ...

  4. DOS特殊字符的转义方法

  5. 智子: Vue Vapor年底发布alpha版本,如果有资金支持

    前言 在最近的Vue Fes大会上,Vue Vapor的作者智子大佬宣布,如果能够得到资金支持,那么Vue Vapor年底就能发布alpha版本了. 关注公众号:[前端欧阳],给自己一个进阶vue的机 ...

  6. 一文彻底弄懂Java的IO操作

    Java 的 IO(输入/输出)操作是处理数据流的关键部分,涉及到文件.网络等多种数据源.以下将深入探讨 Java IO 的不同类型.底层实现原理.使用场景以及性能优化策略. 1. Java IO 的 ...

  7. 让性能提升56%的Vue3.5响应式重构之“版本计数”

    前言 Vue3.5响应式重构主要分为两部分:双向链表和版本计数.在上一篇文章中我们讲了 双向链表 ,这篇文章我们接着来讲版本计数. 欧阳年底也要毕业了,加入欧阳的面试交流群(分享内推信息).高质量vu ...

  8. nginx防盗链接的使用

    以 local.hyperf.com为例 nginx配置文件如下 # 至少需要一个 Hyperf 节点,多个配置多行 upstream hyperf { # Hyperf HTTP Server 的 ...

  9. Django3.0

    Django3.0 简介 Django 最初被设计用于具有快速开发需求的新闻类站点,目的是要实现简单快捷的网站开发.以下内容简要介绍了如何使用 Django 实现一个数据库驱动的 Web 应用. Dj ...

  10. 五、FreeRTOS学习笔记-任务创建和删除(动态方式)

    1任务控制块:保存任务的一些信息 (STM32的栈是由告高地址向低地址延伸的,由上向下生长) (STM32的堆是由告低地址向高地址延伸的,由下向上生长) 第一步申请内存 如下如所示步骤找到xTaskC ...