Python包管理不再头疼:uv工具快速上手

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来安装。

```bash
# 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命令检查是否安装成功:

Python包管理不再头疼:uv工具快速上手

3. 如何使用

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

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

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

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

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

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

3.1. 创建项目

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

```bash
$  uv init myproject
Initialized project `myproject` at `D:projectspythonmyproject`

$  cd .myproject

$  ls


    目录: D:projectspythonmyproject


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 只是一段演示用的代码,

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

```bash
$  cat .hello.py
def main():
    print("Hello from myproject!")


if __name__ == "__main__":
    main()
```

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

```bash
$  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. 操作环境

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

```bash
$  uv sync
Using CPython 3.12.4 interpreter at: D:miniconda3envsdatabookpython.exe
Creating virtual environment at: .venv
Resolved 1 package in 15ms
Audited in 0.05ms
```

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

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

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

```bash
$  ls


    目录: D:projectspythonmyproject


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来运行。

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

```bash
$  uv run .hello.py
Hello from myproject!
```

3.3. 管理依赖

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

```bash
$  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 文件的变化。

```bash
$  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中使用。

```bash
$  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,下面在试试删除依赖会怎么样。

```bash
$  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看看。

```bash
$  uv run .hello.py
Traceback (most recent call last):
  File "D:projectspythonmyprojecthello.py", line 1, in 
    import pandas as pd
ModuleNotFoundError: No module named 'pandas'
```

果然,无法运行了。

3.4. 区分开发和生产环境

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

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

```bash
$  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中可以看出不同环境的包依赖。

```bash
$  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 项目的开发流程,提高开发效率。

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4799.html

(0)
LomuLomu
上一篇 2024 年 12 月 29 日 上午12:33
下一篇 2024 年 12 月 29 日 上午1:04

相关推荐

  • 华为OD机试E卷 –模拟目录管理功能–24年OD统一考试(Java & JS & Python & C & C++)

    文章目录 题目描述 输入描述 输出描述 用例 题目解析 JS算法源码 Java算法源码 python算法源码 c算法源码 c++算法源码 题目描述 实现一个模拟目录管理功能的软件,输入一个命令序列,输出最后一条命令运行结果。支持命令: 创建目录命令:mkdir 目录名称,如 mkdir abc 为在当前目录创建abc目录,如果已存在同名目录则不执行任何操作。…

    未分类 2025 年 1 月 15 日
    11700
  • 履约系统:应用层、领域层、集成关系设计

    大家好,我是汤师爷~ 在这篇文章中,我们一起探讨订单履约系统的应用架构设计。 应用架构设计 我们前面讨论了系统的核心概念模型和拆单逻辑。接下来,让我们从应用架构的角度,深入了解系统的各个层次。这包括应用层、领域层,以及与其他系统的集成关系。 应用层能力 应用层定义软件的应用功能,它负责接收用户请求,协调领域层能力来执行任务,并将结果返回给用户,核心模块包括:…

    2025 年 1 月 1 日
    11700
  • 实战指南:理解 ThreadLocal 原理并用于Java 多线程上下文管理

    目录 一、ThreadLocal基本知识回顾分析 (一)ThreadLocal原理 (二)既然ThreadLocalMap的key是弱引用,GC之后key是否为null? (三)ThreadLocal中的内存泄漏问题及JDK处理方法 (四)部分核心源码回顾 ThreadLocal.set()方法源码详解 ThreadLocalMap.get()方法详解 Th…

    2025 年 1 月 22 日
    21400
  • Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)

    Hiヽ(゜▽゜ )-欢迎来到蓝染Aizen的CSDN博客~ 🔥博客主页: 【✨蓝染 の Blog😘】 💖感谢大家点赞👍收藏⭐评论✍ 文章目录 一、JavaFx介绍 1、JavaFx简介 2、可用性 3、主要特征 4、UI控件 二、JavaFx概述 1、JavaFx结构图 2、JavaFx组件 (1)舞台 (2)场景 ① 场景图 ② 节点 (3)控件 (4)布…

    2024 年 12 月 28 日
    12900
  • Python数据结构与算法分析 第3版PDF、EPUB免费下载

    适读人群 :1. 希望学习数据结构和算法的Python用户; 2. 计算机专业的学生和老师。 只有洞彻数据结构与算法,才能真正精通Python!热门计算机科学教材,华盛顿大学、北京大学等多家高校采用,让你在代码编写的战场上所向披靡! 电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍 点击原文去下载 书籍信息 作者: [美] 布拉德利·…

    2025 年 1 月 7 日
    8900

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信