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

news/2024/12/27 12:55:52/文章来源:https://www.cnblogs.com/wang_yb/p/18635441

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\myprojectMode                 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\myprojectMode                 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 pddef 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 项目的开发流程,提高开发效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/859812.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

博客园markdown及配图自动上传配置

解决自己使用markdown写博客,上传到博客园上面,需要一张一张重新上传图片的问题博客园markdown与配图自动上传配置(mac版 m芯片)引言 安装配置工具 尾注前言 目的:因为自己使用markdown写博客,但是在博客园上面发布的时候,发现本地写好的markdown文件,上传到博客园上面…

【unity】学习制作类银河恶魔城游戏-4-

制作攻击计数器给全部攻击动作应用帧事件但是理想情况下应该是,短间隔时间内连续点击鼠标才能连击,加入连击计时器编辑代码修补“桶子” 解决攻击时移动的问题解决冲刺时攻击的问题解决无方向键输入时原地冲刺的问题解决空中攻击无法掉落的问题继承“inheritance”(继承)是…

React 移动端框架

1. Material-UI Material-UI 组件是独立工作的。 它们是自我支持的,并只要注入而且仅注入它们需要显示的样式。 他们不依赖任何全局的样式表,如 normalize.css。Material-UI首先是移动开发的,我们首先为移动设备编写代码,然后根据需要使用CSS媒体查询扩展组件。 要确保所有…

hbuilder 调试跨域问题解决方案

放到 system.webServer 节点下 web.config<httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Headers" value="Content-Type" /> <…

Maven仓库配置

阿里云镜像仓库地址 仓库服务 (aliyun.com) 获取配置信息修改settings.xml配置文件1.配置阿里云镜像加速<mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name> <url>https://maven.aliyun.com/rep…

【JS逆向】爬虫逆向知识点

一、逆向基础1.1 语法基础1.2 作用域1.3 窗口对象属性1.4 事件二、浏览器控制台2.1 Network2.1.1 Network-Headers2.2 Sources2.3 Application2.4 Console三、加密参数的定位方法3.1 巧用搜索3.2 堆栈调试3.3 控制台调试3.4 监听XHR3.5 事件监听3.6 添加代码片3.7 Hook四、常见…

timeago.js-将datetime时间转化为模糊时间的js工具库

timeago.js是一个非常简洁、轻量级、不到 2kb 的很简洁的Javascript库,用来将datetime时间转化成类似于*** 时间前的描述字符串,例如:“3小时前”。本地化支持,默认自带中文和英文语言,基本够用; 之前 xxx 时间前、xxx 时间后; 支持自动实时更新; 支持npm方式和浏览器s…

【日记】今天不是很忙(205 字)

正文一晃就快周五了。今天不是很忙,但也没做什么事情。无非就是原来塞满的工作时间节奏快了一些,现在慢了一些而已。我觉得我还是缺乏勇气。尤其是那种,在重大选择前做决策的勇气。也或许那个不叫勇气,叫做准备。每天的日记都会反省自己,但是依旧没什么进步呢。 成功日记:…

【启智社区】【大语言模型原理与实践】1.大语言模型的发展

大语言模型(Large Language Models,LLM)是一种由包含数百亿以上权重的深度神经网络构建的语言模型,使用自监督学习方法通过大量无标记文本进行训练。自2018年以来,包含Google、OpenAI、Meta、百度、华为等公司和研究机构都纷纷发布了包括BERT、GPT等在内多种模型,并在几乎…

简单实用的jQuery表单输入框浮动标签动画特效插件

phAnimate是一款简单实用的jquery表单输入框浮动标签动画特效插件。通过该插件,你可以非常轻松的为表单input元素添加浮动标签动画效果。在线预览 下载使用方法 在页面中引入jquery和phanimate.jquery.js文件。<script type="text/javascript" src="js/jqu…