”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 uv 掌握 Python 项目管理 PartIt&#s Time to Ditch Poetry

使用 uv 掌握 Python 项目管理 PartIt&#s Time to Ditch Poetry

发布于2024-11-04
浏览:596

Mastering Python Project Management with uv PartIt

您是否厌倦了为了控制 Python 环境和依赖项而使用 pip、virtualenv、conda、poetry 和 pyenv 等多个工具?你并不孤单!管理 Python 项目可能会让人感到头疼,尤其是在需要处理各种不同的包管理器和工具的情况下。

输入 uv通用 Virtualenv。将其视为一站式包管理器,旨在简化和加速您的 Python 开发过程。


一些背景故事

uv 从另一位现代打包管理器 Rye 中汲取灵感,统一了 pip、pip-tools、pyenv、virtualenv 和 Poetry 的最佳功能。 uv 使用 Rust 构建,不仅速度快,而且效率高,简化了从管理依赖项到创建虚拟环境的一切。

紫外线的目的

简而言之,uv 就是整合。当您可以获得一种统一的体验时,为什么要在多种工具之间切换?它旨在消除 Python 开发中的摩擦,为您提供更一致、更快速的项目管理方式。而且速度还很快!这为动态管理打开了新的大门


1. 带有内联脚本元数据的可移植代码

让我们谈谈依赖关系

uv 最令人兴奋的功能之一是能够直接在 Python 脚本中添加依赖项。想象一下你有一个像这样的简单脚本:

# app.py
import requests
from rich.pretty import pprint

response = requests.get("https://peps.python.org/api/peps.json")
data = response.json()
pprint([(k, v["title"]) for k, v in data.items()][:10])

运行此脚本通常意味着设置虚拟环境并手动安装依赖项。使用 uv,您可以将所有依赖项直接嵌入到脚本中,使其成为自包含可共享

$ uv add --script app.py 'requests



自动元数据生成

这会将元数据添加到脚本文件中:

# /// script
# dependencies = [
#   "requests



就是这样!您可以与其他人共享此文件,他们只需运行:

$ uv run app.py

瞧——无需外部设置!这一切都归功于 uv 的速度和效率。


2. 创建和管理虚拟环境

虚拟环境入门

默认情况下,uv 要求在虚拟环境中安装软件包,以保持系统干净并避免不同项目之间的冲突。用uv创建虚拟环境很简单:

$ uv venv

这将创建一个包含隔离环境的 .venv 目录。如果你想指定自定义目录或Python版本,你可以这样做:

$ uv venv my_env --python 3.9

环境已准备好使用,uv 将自动检测您的所有命令,例如安装包或运行脚本。

何时使用 uv add 与 uv pip install

  • 使用 uv add:当你想向项目的 pyproject.toml 文件添加依赖项时。当您正在开发项目并希望跟踪所有依赖项以使项目易于共享和复制时,这是最好的选择。我们将在下一篇文章中对此进行介绍,敬请期待!

    $ uv add fastapi
    

    这将更新您的 pyproject.toml 并将版本锁定在 uv.lock 中。

  • 使用 uv pip install:当您想要安装包以快速使用而不修改项目文件时,或者对于不需要在 pyproject.toml 中跟踪它们的全局工具时。将 uv pip 视为一种直接的一次性安装。

    $ uv pip install requests
    

选择正确的命令可确保您的项目得到正确管理并易于共享或部署。


3. 锁定版本以实现可重复性

您的代码是否曾因更新而被破坏过?

我们都经历过这样的情况——您的代码今天可以运行,但明天就会因为包更新而崩溃。使用 uv,您可以通过锁定软件包版本来防止这种情况,以确保一致性和可重复性:

[tool.uv]
exclude-newer = "2023-10-16T00:00:00Z"

这样,即使出现新版本的依赖项,您的项目也保持稳定。非常适合无法承受意外的长期项目!


4. 管理Python版本

不同的项目,不同的Python版本?没问题!

许多开发人员必须处理需要不同 Python 版本的多个项目。 uv 让切换版本变得如此简单:

$ uv python install 3.8 3.9 3.10

安装版本后,它们之间的切换是无缝的:

$ uv run --python 3.10 app.py

如果您想锁定项目的特定版本:

$ uv python pin 3.9

不再需要杂耍 pyenv 命令——uv 会为您处理所有繁重的工作。


5. 告别 pip 麻烦

虽然是点,但更快更好

uv 提供类似 pip 的体验,但具有涡轮增压的性能。安装软件包很简单:

$ uv pip install flask

需要添加可选依赖项或直接从 GitHub 存储库安装?不费吹灰之力:

$ uv pip install 'torch>=1.10.0' "git https://github.com/astral-sh/ruff"

不再需要等待缓慢的安装 - uv 可以快速有效地完成工作。


6. 轻松全局管理 CLI 工具

从黑色到皱褶,轻松获取您的工具

无论您是要检查代码还是格式化文件,uv 都可以让安装 CLI 工具变得简单:

  • 全球

    $ uv tool install ruff
    
  • 项目内本地

    $ uv add ruff
    
  • 运行临时命令而不全局安装:

    $ uvx black my_code.py
    

告别包冲突和环境污染——随时随地运行您的工具。


如果您希望增强您的 Python 开发能力并希望停止使用多种工具,uv 就是您的答案。凭借其简化的命令、可重现的环境和高效的包管理,uv 使 Python 开发成为一种乐趣而不是一件苦差事。

准备好尝试一下紫外线了吗? ?从今天开始,体验管理 Python 项目的更好方法。


请继续关注第 2 部分,我们将深入探讨高级功能,例如利用 pyproject.toml、处理全局与本地工具安装,以及 uv 如何成为管理复杂环境时最好的朋友。

编码愉快! ?✨

有关更多详细信息和完整文档,请查看 uv 文档。

版本声明 本文转载于:https://dev.to/thomas_bury_b1a50c1156cbf/mastering-python-project-management-with-uv-part1-its-time-to-ditch-poetry-3bi0?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-14
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-14
  • 如何使用命令式方法更新 React 中的嵌套状态?
    如何使用命令式方法更新 React 中的嵌套状态?
    更新嵌套状态的命令式方法在 React 中,状态更新是不可变的。这意味着要更新嵌套对象或数组,您不能简单地修改其属性并期望更改反映在 UI 中。相反,您需要创建一个包含更新值的新对象或数组,然后将其传递给 setState。考虑以下示例,其中我们要更新对象中索引 1 处的对象的 name 属性存储在...
    编程 发布于2024-11-14
  • 原子变量有哪些不同的内存排序模型?
    原子变量有哪些不同的内存排序模型?
    理解内存排序的含义原子变量提供安全的内存访问和跨线程同步。了解不同的内存顺序对于有效利用它们至关重要。轻松:无内存同步。可能重新排序的优化操作读取和写入。顺序一致 (seq_cst):最严格的排序。防止对周围的任何内存操作进行重新排序原子操作。确保所有线程的内存访问一致。获取/释放:宽松之间的混合和...
    编程 发布于2024-11-14
  • 为什么在 For 循环中放错 Return 语句会影响输入循环?
    为什么在 For 循环中放错 Return 语句会影响输入循环?
    For循环中返回语句错位在你的作业中,你遇到了一个问题,程序只允许输入一只宠物,尽管瞄准三个。这个问题源于 make_list 函数中 return 语句的定位。在 for 循环中,return 语句在到达函数时立即终止函数的执行。在提供的代码中,return 语句放置在循环内部,导致函数在第一次迭...
    编程 发布于2024-11-14
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-14
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-14
  • 除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-14
  • 如何防止用户关闭 Bootstrap 模式?
    如何防止用户关闭 Bootstrap 模式?
    禁用用户启动的 Bootstrap 模态退出您可以通过单击 Bootstrap 模态区域外部来阻止用户关闭 Bootstrap 模态。这在您想要强制用户在继续操作之前与特定模态内容交互的情况下非常有用。禁用模态背景点击关闭默认情况下,用户可以通过单击模式窗口之外的任意位置来关闭模式。要禁用此行为:在...
    编程 发布于2024-11-14
  • 如何在 Python 中将嵌套列表导出到 CSV 文件?
    如何在 Python 中将嵌套列表导出到 CSV 文件?
    在Python中将嵌套列表导出到CSV文件将嵌套列表(其中每个内部列表包含不同类型的元素)写入CSV文件可以在 Python 中处理数据时这是一项常见任务。以下是应对这一挑战的方法:Python 的 csv 模块提供了处理 CSV 操作的便捷方法。要将列表的列表(例如 a = [[1.2,'...
    编程 发布于2024-11-14
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1和$array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求是构...
    编程 发布于2024-11-14
  • 如何高效提取Go Slice的最后一个元素?
    如何高效提取Go Slice的最后一个元素?
    Go 提取切片最后一个元素的最佳方法在 Go 中使用切片时,有效操作元素至关重要。一个常见的任务是提取最后一个元素,这可以通过多种方法来实现。现有解决方案的缺点使用切片提供的解决方案[len(slice)-1 :][0] 看起来很麻烦并且涉及不必要的复杂性。它返回一个仅包含最后一个元素的切片,然后使...
    编程 发布于2024-11-14
  • 为什么我的 JavaScript 事件在动态元素追加后没有触发?
    为什么我的 JavaScript 事件在动态元素追加后没有触发?
    动态元素追加后 JavaScript 事件未触发您遇到了向 DOM 追加新元素后 JavaScript 事件未触发的问题。这是因为 jQuery 仅识别页面加载期间最初运行时存在的元素。要解决此问题,您需要使用事件委托来捕获动态元素中的事件。事件委托涉及捕获页面加载期间已经存在的 DOM 中更高级别...
    编程 发布于2024-11-14
  • `unshift()` 是在 JavaScript 中将元素添加到数组的最有效方法吗?
    `unshift()` 是在 JavaScript 中将元素添加到数组的最有效方法吗?
    JavaScript 中的最佳数组前置将元素前置到数组的开头是 JavaScript 中的常见要求。在这里,我们探索一种比问题中建议的传统方法更好的方法。Unshift 方法:本机解决方案JavaScript 提供了一个名为 unshift 的内置方法有效地将元素添加到数组的开头。与涉及创建新数组和...
    编程 发布于2024-11-14
  • 在 JavaScript 中通过构造函数定义方法是否会创建重复的函数副本?
    在 JavaScript 中通过构造函数定义方法是否会创建重复的函数副本?
    JavaScript 中通过原型与构造函数定义方法的性能影响在 JavaScript 中,存在两种创建具有公共函数的“类”的方法:使用原型或构造函数。方法 1 通过构造函数将函数分配给实例,而方法 2 利用原型在所有实例之间共享函数。虽然方法 2 通常被认为更高效,但剥夺实例的私有实例变量是一个显着...
    编程 发布于2024-11-14

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3