第二篇:使用 uv 管理 Python 项目
itomcoil 2025-08-03 05:28 8 浏览
uv 工具是一个高速的 Python 包和项目管理器。它用 Rust 编写,旨在简化你的工作流程。它提供了快速的依赖项安装,并将多种功能集成到一个工具中。
使用 uv,你可以安装和管理多个 Python 版本,创建虚拟环境,高效处理项目依赖项,重现工作环境,甚至构建和发布项目。这些功能使得 uv 成为管理 Python 项目的“一站式”工具。
在本教程结束时,你将明白:
- uv 是一个 Python 包和项目管理器,它将多种功能集成到一个工具中,为管理 Python 项目提供了一个全面的解决方案。
- uv 用于快速依赖项安装,虚拟环境管理,Python 版本管理和项目初始化,提升生产力和效率。
- uv 可以构建和发布 Python 包到包仓库,例如 PyPI,支持从开发到分发的简化流程。
- uv 自动处理虚拟环境,根据需要创建和管理它们,以确保项目依赖项的清洁和隔离。
要深入学习如何使用 uv 高效管理 Python 项目,你应该具备使用 Python 虚拟环境的基本知识,了解如何为项目设置 pyproject.toml 文件,以及如何构建可分发的项目包。
一、了解 Python 中的 uv
在本教程中,你将探索另一个用 Rust 为 Python 制作的酷炫工具。你将了解 uv,这是一个极其快速的 Python 包和项目管理器。
此外,uv 将像 pip、pip-tools、pipx、poetry、pyenv、twine、virtualenv 等工具提供的大多数功能集成到一个工具中。因此,uv 是一个“一站式”解决方案。
以下是 uv 用于管理 Python 项目的关键功能列表:
- 快速依赖项安装:安装依赖项非常快,对于大型依赖树尤其有用。
- 虚拟环境管理:自动创建和管理 虚拟环境(参考第一篇文章)。
- Python 版本管理:允许安装和管理多个 Python 版本(参考第一篇文章)。
- 项目初始化:搭建完整的 Python 项目,包括根目录、Git 仓库、虚拟环境、pyproject.toml、README 等。
- 依赖项管理:安装、更新、移除和锁定直接和 传递依赖项,允许环境可重现。
- 包构建和发布管理:允许你将包构建并发布到像 Python Package Index (PyPI) 这样的包仓库。
- 开发工具支持:安装并运行开发工具,例如 pytest、Black 和 Ruff。
除了这些功能外,uv 是一个独立的二进制文件,允许轻松安装和快速升级。你不需要在系统上安装 Python 就可以安装 uv。
因此,在对 uv 及其主要功能进行了这个简短的总结之后,你就可以在系统上安装这个工具了。这将在接下来的部分中完成。此外,你还将学习如何更新你的 uv 安装。
二、升级到最新版本的 uv
关于 uv的安装,可以参考第一篇文章。
正如你所知,时间过得很快。uv 项目目前正处于积极开发中,这意味着新版本会定期发布。
如果你使用的是 独立安装程序 安装的 uv,并且希望跟上最新版本,那么你可以运行以下命令:
uv self update
在macOS 中执行:
sudo uv self update
Password:
info: Checking for updates...
success: Upgraded uv from v0.6.16 to v0.7.4! https://github.com/astral-sh/uv/releases/tag/0.7.4
检查版本:
uv --version
uv 0.7.4 (6fbcd09b5 2025-05-15)
uv self update 命令会检查是否有新版本可用。如果存在,该命令会为你下载新包并安装。
如果你使用的是 pipx 安装的 uv,并且希望升级它,那么你可以运行以下命令:
pipx upgrade uv
此命令允许你将 uv 安装升级到最新版本,前提是你使用的是 pipx。
三、使用 uv 处理 Python 项目
现在来到了有趣的部分 —— 创建和管理 Python 项目的部分。在本节中,你将探索 uv 的功能和命令,这些功能和命令使你可以快速高效地完成这些操作。
创建 Python 项目
要使用 uv 创建并初始化 Python 项目,请导航到你希望存储项目的目录。到达后,你可以运行以下命令来创建并初始化项目:
uv init rpcats
请注意,项目名称由你决定。在本例中,你将使用 rpcats 来表示这是一个用于检索和显示猫信息的 Real Python 项目。
上述命令会在 rpcats/ 文件夹下创建以下目录结构:
这太棒了!首先,你有一个 .git/ 目录,它是项目的 Git 仓库。 .gitignore 文件允许你定义你希望在版本控制工作流中跳过的文件和文件夹。默认情况下,uv 会自动用大多数 Python 项目适用的合理条目填充此文件,确保不需要的文件不会被纳入版本控制。
.python-version 文件包含当前项目的默认 Python 版本。此文件告诉 uv 在为项目创建专用虚拟环境时应使用哪个 Python 版本。接下来,你有一个空的 README.md 文件,你可以用它为你的项目提供基本文档。
main.py 文件是一个占位符 Python 文件,最初包含以下代码:
def main():
print("Hello from rpcats!")
if __name__ == "__main__":
main()
在这个例子中,你有一个 main() 函数,它会在屏幕上打印一条消息。在文件底部,你还会看到熟悉的 if __name__ == "__main__" 用法,这是这类可执行文件中的常见做法。
最后,你有一个带有以下初始内容的 pyproject.toml 文件:
[project]
name = "rpcats"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = []
此文件在 [project] 下包含基本的配置键值对。你可以根据需要更新任何键的值。例如,你可以将 description 改为类似以下内容:
[project]
name = "rpcats"
version = "0.1.0"
description = "显示指定品种的猫的信息。"
readme = "README.md"
requires-python = ">=3.13"
dependencies = []
现在,你的项目有了一个明确的描述。你还可以更改项目的版本、所需的 Python 版本等。
注意:如果你想使用 uv 开始管理一个现有的项目,那么请导航到项目的目录并运行以下命令:
uv init
此命令将为你创建 uv 项目的结构。如果你已经有一个 main.py 文件,它不会覆盖该文件,但如果缺少该文件,它会为你创建一个。它既不会修改你的 Git 仓库,也不会修改你的 README.md 文件。
然而,如果你已经有一个 pyproject.toml 文件,那么这个命令将无法工作。如果是这种情况,你可以将该文件移动到其他位置,然后运行 uv init 命令。最后,你可以将旧的 pyproject.toml 文件中的任何相关配置更新到新文件中。
就这样!你已经使用 uv 创建了你的第一个项目。现在你可以运行项目的入口脚本,即默认的 main.py,来检查一切是否正常运行。
运行项目的入口脚本
创建项目后,你可以使用 uv 运行入口脚本,即默认的 main.py 文件。要运行脚本,请执行以下命令:
uv run main.py
输出:Hello from rpcats!
首次运行此命令时,uv 为项目创建了一个专用的 Python 虚拟环境。最终输出行会显示调用 main.py 中定义的 main() 函数的结果。
如果你再次检查项目的根目录内容,你会看到一个名为 .venv 的文件夹,其中包含项目的专用虚拟环境。
你还会看到一个名为 uv.lock 的新文件,这是一个跨平台的 锁定文件,其中包含有关项目依赖项的信息。此文件确保其他开发者可以快速且精确地重现你的工作环境,从而增强团队协作和代码贡献。
与 pyproject.toml(通常指定项目的直接依赖项)不同,uv.lock 文件包含在项目环境中安装的任何依赖项的确切版本。
uv.lock 文件使用 TOML 格式。你应该将此文件添加到版本控制中,但不应手动编辑它。相反,你可以让 uv 来管理它。你稍后会了解更多关于这个文件的内容。
相关推荐
- python学习教程-第七节内容
-
函数(重点)基本概念Python函数的语法是编程中的核心概念之一,它允许你将代码块封装为可重复调用的单元。基本语法定义函数:示例参数类型位置参数(PositionalArguments)按参数定义...
- Python排序90%人只会用sorted()?这7个高阶技巧让你代码效率翻倍
-
高效处理数据的关键,往往从掌握排序开始。排序操作在Python编程中的重要性常被低估——直到你面对一个杂乱无章的数据集。作为数据处理的核心操作之一,排序效率直接决定了程序性能和代码可读性。无论你正在清...
- 第四章:Python函数
-
4.1函数的定义与调用4.1.1理论知识函数是组织好的、可重复使用的代码块,用于执行特定的任务。它可以提高代码的复用性和可维护性。在Python中,定义函数使用def关键字,其基本语法如下:def...
- ArcGIS 一个独立运行的Python程序编写和打包
-
写代码#coding=utf8#-*-coding:UTF-8-*-importarcpyfromarcpyimportenvimportosimportsys##########...
- python入门到脱坑经典案例—计算三角形的面积
-
下面为大家详细讲解如何用Python计算三角形面积。我们会从最基础的数学公式开始,逐步深入编程实现,并涵盖多个实用版本。以下是完整的教学指南:1.数学原理回顾三角形面积公式:面积=(底边长度...
- Python运算技巧:10种计算列表平方的高效方法
-
1.使用for循环此方法遍历列表中的每个数字,使用**运算符计算其平方,然后将结果添加到新的列表中。2.使用列表推导式此方法使用列表推导式,这是一种更简洁的方式,可以在现有列表的每个项目上执行操作...
- 墙裂推荐,5个学习Python编程最佳的开源库
-
学习Python少不了的就是项目,我在GitHUB上找了几个比较好的开源库,大家可以跟着去学习。1、learn-python3这个存储库一共有19本Jupyter笔记本。它涵盖了字符串和条件之类的基础...
- 使用Python玩转ftplib库:实现ftp文件传输自动化全攻略
-
大家好!在日常工作中都会使用到ftp功能,用于上传和下载文件等,本章主要介绍Python的标准库ftplib来实现FTP文件传输,帮助我们实现ftp自动化。一、ftplib库核心函数速查表1连接与登...
- Python零基础入门学习23:常用第三方库之图像处理库Pillow
-
注:本文所有代码均经过Python3.7实际运行检验,保证其严谨性。本文约2000字,阅读时间约为4分钟。Pillow库的概述Pillow库是Python最好的图像处理库,可能是使用频率最高的图像处...
- Python编程之BeautifulSoup库
-
#头条创作挑战赛#BeautifulSoup是一个可以从HTML或XML文件中快速提取数据的Python库。它能够通过转从入门到精通Python网络爬虫框架Scrapy38换器实...
- Python3 新一代Http请求库Httpx使用(详情版)
-
我们经常使用Python语言的朋友们都清楚,requests是使用率非常高的HTTP库,甚至更早Python2中使用的是urllib、urllib2,也给我们提供了许多方便的功能。但是自从...
- 小白也可以玩的Python爬虫库,收藏一下
-
最近,微软开源了一个项目叫「playwright-python」,作为一个兴起项目,出现后受到了大家热烈的欢迎,那它到底是什么样的存在呢?今天为你介绍一下这个传说中的小白神器。Playwright是...
- apscheduler,一个超厉害的 Python 库!
-
大家好,今天为大家分享一个超厉害的Python库-apscheduler。Github地址:https://github.com/agronholm/apschedulerAPSchedule...
- 给3D Slicer添加Python第三方插件库
-
对临床医生或医学影像算法研究人员来说,3DSlicer是不错的临床实践或科研工具。随着人工智能和深度学习技术的普及,python已经作为原型开发和验证的计算机编程语言。3DSlicer自带pyt...
- Paramiko:一个非常实用的Python库
-
前言Python的Paramiko库,它是一个用于实现SSHv2协议的客户端和服务器的库。通过使用Paramiko,我们可以在Python程序中轻松地实现远程服务器的管理、文件传输等功能。特别做智能硬...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)