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

相关推荐

  • 数据结构(Java版)第二期:包装类和泛型

    目录 一、包装类 1.1. 基本类型和对应的包装类 1.2. 装箱和拆箱 1.3. 自动装箱和自动拆箱 二、泛型的概念 三、引出泛型 3.1. 语法规则 3.2. 泛型的优点 四、类型擦除 4.1. 擦除的机制 五、泛型的上界 5.1. 泛型的上界的定义 5.2. 语法规则 六、泛型方法 6.1. 定义语法 6.2. 交换方法的实例 七、通配符 包装类和泛型…

    2025 年 1 月 1 日
    30800
  • Spring Boot与WebSocket融合全攻略:从入门到高阶应用

    一、WebSocket基础概念与核心原理 1.1 WebSocket协议的本质内涵 WebSocket是一种在单一TCP连接上开展全双工通信的协议,它攻克了HTTP协议在实时通信方面的局限。不同于HTTP那种请求 – 响应的模式,WebSocket允许服务器主动向客户端推送数据,实现了真正意义上的双向交互。 传统HTTP通信的弊病所在: 每一次请求都得重新搭…

    未分类 2025 年 6 月 18 日
    42500
  • 从零开始的Python世界生活——语法基础先导篇(Python小白零基础光速入门上手)

    从零开始的Python世界生活——语法基础先导篇(Python小白零基础光速入门上手) 1. 准备阶段 1.1 下载并安装Python 1.1.1 下载步骤: 访问Python官方网站:点击这里下载Python 在页面上,选择适合你操作系统的Python版本(Windows、macOS或Linux)。 点击下载按钮,开始下载安装程序。 1.1.2 安装步骤:…

    未分类 2025 年 1 月 6 日
    33100
  • 库存系统:仓库层、调度层、销售层的库存数据模型设计

    大家好,我是汤师爷~ 让我们一起深入挖掘库存概念模型的设计精髓,这不仅是构建库存管理系统的基石,更是确保库存数据精准和一致性的核心所在。 库存的数据模型设计 下图展示了库存概念模型的设计概览。通过精心设计的概念模型,我们能够有效支撑库存管理的多元化业务需求。 仓库层 仓库层是商品库存存放和管理的实际场所,承担着具体的仓储操作任务。它涵盖了企业自建仓库、第三方…

    2024 年 12 月 24 日
    37900
  • Python并行计算实战:多进程间数据共享的两种高效方案

    Python并行计算实战:多进程间数据共享的两种高效方案 核心要点 在Python多进程编程中,实现进程间数据共享主要有两种方式:共享内存机制和服务进程管理。前者通过Value和Array直接操作物理内存,具有高性能优势但需要同步锁保障安全,支持数值、数组及自定义结构体(需借助ctypes模块)。后者通过Manager服务进程管理共享对象,支持更丰富的数据类…

    未分类 2025 年 5 月 19 日
    36800

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信