【Python】这个包管理器真的可以节约你的时间和磁盘空间-uv

在过去的一年左右时间里,我一直在用 Poetry 来管理 Python 的环境和包,它确实帮了我不少忙。不过,出于持续改进的精神和对新鲜事物的好奇心,我开始尝试一款叫做 uv 的工具,据说它可以进一步简化这些任务。我已经玩了它几个月的时间。

uv 是一个超快的 Python 包安装器和解析器,用 Rust 编写,设计上可以作为 pippip-tools 工作流的直接替代品。

如果你想了解更多关于 uv 的理念和发展历程,可以看看开发者们的 博客文章。

为什么 uv 值得探索

速度与效率

根据 uv 的文档,它的最大亮点之一就是速度。官方宣称能大幅减少包的安装时间,性能据说比 pip 快上100倍。你可以在 这里 查看那些令人印象深刻的基准测试结果。

这个速度潜力挺有意思,不过对我而言这并不是个关键因素,我的项目通常不复杂到需要担心这个问题。大多数时候,我手头有的只是原始数据和几个 Jupyter 笔记本或脚本。但 uv 确实比其他选项(比如 Pip 或 Poetry)更快,这一点总是好的。

磁盘空间利用效率

另一个 uv 强调的功能是它在磁盘空间管理上的方法,类似于 Node.js 生态系统中 pnpm 的工作方式。uv 使用全局缓存来最小化冗余,确保相同的包只存储一次,不论有多少个项目需要用到它们。理论上,这种方法可以避免你的系统因为重复的包而变得臃肿不堪。

这一点一直让我很烦恼:为什么我要把同样的包重新安装到每个虚拟环境中,导致不必要的磁盘占用?现在好了,这问题解决了,真是让人开心。

ipykernel 这样的工具仍然需要在每个环境中安装以确保与 Jupyter 笔记本的正确集成。但目前为止,这个设置对我来说运行得非常好。我可以迅速启动新项目,并且感觉比起用 Poetry 时花在调整环境上的时间要少得多。

使用 uv 来处理 Python 安装也是一个非常有用的功能。以前我用的是 pyenv-win,但现在 uv 让我不再需要它。虽然 uv 的工作方式有些不同,但我喜欢它的简单。基本上,uv 会检查你的项目配置文件(当你初始化项目时自动创建,文件以 .toml 结尾),并为你安装必要的 Python 版本。如果你已经安装了所需的 Python 版本,那就好办了,它会识别出来并避免重复安装。

跨平台兼容性

尽管大部分工程师主要是在 Windows 上工作,uv 提供的跨平台支持——涵盖 macOS、Linux 和 Windows——依然值得提一嘴。这一特性保证了如果你需要切换环境,无论是为了特定项目还是合作,你的设置都能保持一致。虽然我用的是 Windows,但知道 uv 能搞定其他平台也让人安心。到目前为止,我的体验非常顺畅。

有些开发人员提到在 Windows/Mac 和 Linux 之间转移项目时遇到了问题,但如果你是位结构工程师,在 Mac 上工作,放下你的手工可颂面包,振作起来吧。

虚拟环境能力

我最喜欢 uv 的功能之一就是它创建虚拟环境的速度有多快多容易。

uv venv

用这条命令,你可以瞬间设置好一个隔离的环境,确保你的项目依赖项与其他项目井水不犯河水。uv 也会从全局缓存中复用包,使得常见的依赖项能够立即安装,进一步加快设置过程。默认情况下,VS Code 会自动识别你的 venv 并与项目同步。这是一个小细节,但却是一个非常贴心的生活质量提升。

通过利用缓存的包,uv 不仅节省了时间,还减少了项目间的冗余。这个功能真的很酷。

有时候东西不太正常,你可能想删除 .venv 文件夹,然后重新创建。超级简单快捷。

如果需要的话,你也可以指定自定义的 venv 名称(例如 my-env)或 Python 版本(例如 3.12.4)。我很少这样做,通常就用 ‘venv’ 作为名称。

uv venv my-env --python 3.12.4

同步你的环境与 uv sync

uv sync 命令旨在让你的虚拟环境与项目的依赖需求保持一致。当你运行:

uv sync

uv 会将当前环境状态与你在 requirements.txtpyproject.toml 文件中指定的依赖进行对比(我个人更喜欢用 pyproject.toml)。然后执行以下操作:

  • 安装:为环境中缺少但在依赖列表中列出的任何依赖项进行安装。
  • 升级/降级:调整现有包的版本,以匹配你在依赖中指定的版本。这确保了你的环境使用你定义的确切版本,这对避免因版本不匹配而导致的意外行为至关重要。
  • 卸载:移除那些已安装在环境中但未在依赖列表中出现的包,使环境保持整洁,免于不必要的膨胀。

你可以在这里查看 uv 命令的详细列表,这样你就能了解你能做些什么。

一步一步教程:使用 UV 设置 Jupyter Notebook

这是一份毫不含糊的教程,目的是让你能够在本地机器上快速启动 Python,并通过 Jupyter Notebook 开始真正的工程工作。

这是我的80%项目的起点。

这份教程略过了 Python 项目设置的一些重要方面,但主要目标是帮助你起步。随着你逐渐熟悉,你会学到更多内部机制。

接下来的几步可能会显得有点晦涩难懂,别担心。随着经验的积累,你会明白 PowerShell 和命令提示符如何成为提高效率的强大工具。

1. 安装 PowerShell

如果你还没有安装最新版的 PowerShell,按照这里的说明进行安装 PowerShell 安装指南。

在这个教程中,我用的是 Version 7.4.5。友情提示 - 安装可能需要几分钟,有时会比较慢。

打开 windows 命令提示符并运行:

winget install --id Microsoft.PowerShell --source winget

2. 安装 uv 并用它来管理 Python

我建议进行一个干净的安装,以便更容易使用,所以假设你还没有安装 Python:

  • 使用 PowerShell 安装 uv
Invoke-WebRequest -Uri https://astral.sh/uv/install.ps1 -OutFile install.ps1; powershell -ExecutionPolicy Bypass -File ./install.ps1

现在 uv 已经安装好了,你可以用它来安装和管理 Python:

  • 要安装最新版本的 Python,运行:
uv python install
  • 你也可以安装特定版本,比如 uv python install 3.12.6
  • 验证 Python 安装是否成功,可以通过检查版本:
uv python --version

之后,uv 就会接管你的 Python 安装管理工作。

使用 uv 来设置 Python 项目是一个高效且简洁的过程,特别适合那些希望通过 Jupyter Notebook 在 VS Code 中进行数据分析和工程计算的用户。以下是如何用 uv 快速搭建一个基本项目的步骤。

使用 uv 设置 Python 项目

步骤 1: 创建项目文件夹并用 uv 初始化
  1. 创建项目文件夹:首先,在你想要存储项目文件的地方创建一个新的文件夹。这个文件夹将成为你的项目目录。你可以通过文件资源管理器或者直接在 PowerShell 中使用如下命令来创建它:

    mkdir flocode_lean_startup
    
  2. 进入项目文件夹:创建完文件夹后,使用 PowerShell 进入该文件夹:

    cd flocode_lean_startup
    
  3. uv 初始化项目:在项目文件夹中,运行以下命令初始化项目:

    uv init
    

    这个命令会创建默认的项目结构,并设置必要的配置来管理 Python 依赖项。生成的结构通常包括:

    flocode_lean_startup/
    │
    ├── pyproject.toml      # 依赖项和设置的主要配置文件
    ├── README.md           # 项目描述和文档
    └── src/                # 主要源代码目录
        └── __init__.py     # 将 src 初始化为 Python 包
    

    如果你需要的话,现在可以创建并激活虚拟环境:

    uv venv
    

    激活虚拟环境:

    .venv\Scripts\activate
    

    一个不错的特性是,如果你还没有创建虚拟环境,uv 会在你向项目添加任何依赖项时自动创建一个。.venv 文件夹会被自动添加到项目的根目录,使得 VS Code 能够轻松找到它,并推荐作为首选的虚拟环境。这减少了额外的步骤,我真的很喜欢这一点,少了一件麻烦事。

步骤 3: 添加第一个包 (ipykernel)

有了初始化的项目,你现在可以添加 ipykernel 包,这是如果你打算使用 Jupyter Notebooks 的必要条件:

uv add ipykernel

接下来,根据需要安装任何其他包。例如,你可能想要添加 pandas 用于数据操作:

uv add pandas

每个 uv add 命令都会将指定的包添加到虚拟环境中,使其可用于你的项目。

步骤 4: 从现有的 .toml 文件安装

如果你有一个带有 .toml 文件(例如,来自 GitHub 的 flocode 项目),你可以通过运行以下命令轻松安装依赖项:

uv sync

此命令会将 pyproject.tomluv.lock 文件中指定的所有依赖项安装或更新到项目的虚拟环境中,确保你的环境与声明的依赖项匹配。

步骤 5: 创建 Jupyter Notebook 文件

一旦你的包都安装好了,就可以创建一个新的 Jupyter Notebook 文件开始处理数据:

  1. 创建笔记本文件:在 VS Code 中,选择 File > New File,命名为 notebook.ipynb,并保存在项目目录中。
  2. 打开笔记本:打开此文件,你将能够在笔记本中编写和执行 Python 代码。
步骤 6: 在 VS Code 中选择虚拟环境

创建笔记本后,确保它使用正确的虚拟环境:

  1. 打开内核选择器:在 VS Code 中的笔记本文件里,查找笔记本界面右上角的内核选择器。
  2. 选择环境:点击选择器并选择与项目关联的虚拟环境(通常是 .venv)。这确保了笔记本使用的是项目虚拟环境中的包和 Python 解释器。
步骤 7: 开始构建

现在你已经准备就绪,可以根据需要添加或移除依赖项。你还可以修改 pyproject.toml 文件以添加许可证信息或项目描述。另一个有用的命令是:

uv pip freeze > requirements.txt 

这条命令会生成一个 requirements.txt 文件,列出当前活动环境中所有已安装的包及其版本。这个文件可以用来在另一系统上重建环境或用于文档目的。

我个人通常使用 pyproject.toml 文件,但许多人更喜欢使用 requirements.txt 文件。


总结

到目前为止,我对 uv 的体验非常积极。它已经取代了 Poetry 成为了我的工具箱中的一员。虽然回到旧代码时可能会有些头疼和记忆模糊,但我确实经历了更少的设置烦恼,能够更多地专注于工作——这对我是极其宝贵的。

uv 的速度和效率令人印象深刻。我一直在等待不可避免的问题出现,但至今一切顺利。

我将继续实验并分享我的发现。目前,如果你对优化环境管理感兴趣,我建议尝试一下 uv。

一如既往,我欢迎反馈,并有兴趣听听是否有人也试过 uv

你是如何管理你的 Python 项目的呢?

你可能感兴趣的:(Python,python,开发语言)