UV終極指南:速度提升100倍的Python包管理器

UV終極指南:速度提升100倍的Python包管理器

文章目录

  • UV是什麼?
  • UV、Poetry、PIP + Virtualenv和Conda:區別
  • UV與PIP&virtualenv
  • Conda vs UV
  • UV與Poetry對比
  • UV入門:簡易指南
  • 步驟 1:安裝UV
  • 步驟 2:啟動新專案
  • 步驟 3:向專案新增初始依賴項
  • 步驟 4:使用UV執行Python指令碼
  • 使用UV管理Python版本
  • 列出現有的Python版本
  • 更改當前專案的Python版本
  • 檢查活動版本
  • 瞭解UV工具
  • UV中的鎖定檔案是什麼?
  • 鎖定檔案與requirements.txt
  • 使用UV進行高階依賴管理
  • 更新依賴項
  • 新增可選依賴項
  • 依賴項組
  • 從PIP和Virtualenv切換到UV
  • 轉換現有的Virtualenv專案
  • 替換常用的pip/virtualenv命令
  • 小結

UV終極指南

大多數 Python 開發者都在處理環境和依賴項管理工具的碎片化問題。市面上有很多工具可供使用,例如 pip、virtualenv、Poetry 和 conda。所有這些工具都有各自的結構和要求。然而,當它們組合使用時,你很快就會發現它們會使任何必要的工作流程變得複雜。而這正是 UV 能夠助你一臂之力的地方,它就是你所需要的真正的 Python 包管理器。

對於那些不瞭解 UV 的人來說,它是一款用 Rust 編寫的現代高效能 Python 包管理器。無需理會其他工具,UV 的目標是將所有這些工具的功能整合到一個只需一個終端命令即可開啟的條件式體驗中。UV 由 Astral 開發,旨在與 pip、virtualenv、pip-tools 和 pyenv 的各個方面進行基準測試,最終目標是成為一款速度更快的一體化依賴項和環境管理工具!

UV是什麼?

UV 是一個黑盒程式,它是一款用 Rust 編寫的現代高效能 Python 包管理器和安裝程式。它是 pip 等傳統 Python 包管理器的直接替代品。它提供類似甚至更佳的速度、更高的可靠性以及依賴項解析的一致性。UV 旨在解決 Python 生態系統中一些最明顯的痛點。漫長的安裝時間、依賴項解析的陷阱以及企業級環境管理的複雜性!所有這些痛點都是 UV 的典型用例,它擁有獨特的架構和周到的實現,以實現快速高效的包工作流程。它的速度比現有的包管理器快 10 到 100 倍!

UV 的目標是透過提供以下整合功能來簡化常見的 Python 開發工作流程:

  • 安裝包:類似於 pip。
  • 環境管理:虛擬環境的替代品。
  • 鎖定依賴項:提供 pip-tools 或 Poetry 的功能,以實現可重複的構建。
  • Python 版本管理:提供 pyenv 的替代方案。

與傳統獨立執行的工具不同,UV 提供了一種統一的、“batteries-included”的 Python 開發方法。它旨在減少開發人員需要管理的工具和命令數量。

UV 的主要優勢包括:

  • 閃電般的軟體包安裝和依賴項解析。
  • 相容現有的 Python 工具和工作流程。
  • 內建虛擬環境管理。
  • 支援現代打包標準。
  • 可靠的依賴項鎖定和可復現的環境。
  • 記憶體高效執行,尤其適用於大型專案。

無論是處理小型個人專案還是管理大型 Python 應用程式,UV 作為 Python 包管理器都能提供強大而高效的解決方案。

UV、Poetry、PIP + Virtualenv和Conda:區別

開發人員在切換到新工具之前經常會問的第一個問題是“它與我目前使用的工具相比如何?”。在 Python 依賴項和專案管理領域,pip、Poetry、Conda 和 virtualenv 已經是最常用的工具。然而,UV 在當今可用的 Python 包管理器中也有其自身的優勢。

下表突出顯示了 UV 在現有 Python 管理工具中的排名:

特性 UV pip + virtualenv Poetry Conda
實現 Rust Python Python Python + C++
速度 比 pip 快 10–100 倍 基準水平 比 pip 更快 比 pip 更慢
記憶體佔用 非常高效 更高 中等
環境管理 內建 需要額外工具 內建 內建
依賴解析 快速的現代解析器 基本 現代解析器 全面
非 Python 包
鎖檔案 是(uv.lock) 否(僅基礎 requirements.txt)
專案結構
包釋出 是(配合 twine)
相容性 相容現有 pip 生態 標準 Python 工具 更具約束的方式 自有生態
錯誤處理 錯誤資訊清晰 基本 良好 良好
資源佔用 極小 適中 適中 較高
科學計算側重
跨平臺一致性 有限 良好 極佳

在此基礎上,我們將分別探討這些工具的優缺點,並與 UV 進行比較。

UV與PIP&virtualenv

Pip 和 virtualenv 一直是用於 Python 環境和包管理的獨立工具。其中,pip 專門用於包管理,而 virtualenv 專門用於隔離環境。以下是它們優缺點的簡要概述:

類別 優勢 劣勢
pip + virtualenv – 成熟的生態,已被多年採納
– 文件與社羣支援豐富
– 適用於基礎專案,簡單有效
– 環境配置與包安裝需要分開執行多個步驟<br>– 面對大型或複雜專案,依賴解析較慢
– 缺少內建鎖定檔案,不利於可復現性

UV相比pip + virtualenv的優勢

以下是 UV 明顯優於 pip + virtualenv 的一些方面:

  • 單一工具:UV 既可用於建立環境,也可用於安裝軟體包。一個命令 (uv) 即可同時完成這兩項操作,從而簡化了整體工作流程。
  • 現代化的並行依賴解析器:UV 的解析器使用現代化的解析器,安裝速度更快,因為它會盡可能更快地並行安裝依賴項。
  • 鎖檔案建立 (uv.lock):UV 自動為我們建立了一個鎖檔案,確保我們每次安裝的軟體包版本相同,並提高了可重複性。

UV與pip + virtualenv對比示例

使用 pip + virtualenv 設定環境並安裝軟體包時,涉及:

virtualenv env
source env/bin/activate
pip install -r requirements.txt

使用 UV 時,您可以執行:

uv env create
uv install

UV 通常比 pip + virtualenv 更快地完成安裝,並使用生成的 lockfile 確保在不同機器上安裝完全相同的軟體包版本。

Conda vs UV

Conda 是一個功能強大且功能多樣的環境和軟體包管理器,在科學界和資料科學領域被廣泛使用。它旨在支援所有軟體包(不僅僅是 Python 軟體包),包括對執行更復雜的科學計算工作流程至關重要的系統級依賴項和系統庫。

以下是 Conda 在 Python 開發中的優缺點。

類別 優勢 劣勢
Conda – 支援非 Python 包,如 CUDA、BLAS、編譯器
– 強大的專案間環境隔離
– 在 Windows、macOS 和 Linux 上行為一致
– 簡化 Python 版本切換
– 由於二進位制體積和解析器複雜性,包安裝較慢
– 消耗更多磁碟空間和記憶體
– 可能在最新包版本上落後於 PyPI

UV優於Conda

UV的優勢如下:

  • 閃電般的軟體包安裝和環境設定:UV 採用 Rust 語言實現,最佳化了並行下載,並加快了軟體包安裝和環境建立的速度,從而顯著提升了環境的建立速度。開發人員將受益於生產力的提升。
  • 極低的記憶體和 CPU 使用率:UV 在執行操作時消耗更少的記憶體和 CPU 資源,即使在資源非常緊張的機器上或在 CI 流水線中,每項資源的使用都至關重要,也能高效執行。
  • 完全相容 Python 打包標準:UV 基於與所有現有 Python 工具和格式(例如 requirements.txt 和 PyPI 索引)相同的打包標準構建。這使得開發人員無需遷移到新的生態系統或維護軟體包列表即可使用 UV。
  • 更易於整合到現有的 Python 工作流程:由於 UV 只關注 Python 軟體包,因此不會在系統級依賴管理方面引入太多額外的複雜性,並且可以與典型的 Python 開發環境無縫整合。

UV與Conda的示例

使用 Conda 設定環境通常如下所示:

conda create -n myenv python=3.9 numpy scipy
conda activate myenv

而使用 UV 時,過程如下:

uv env create -p python=3.9
uv install numpy scipy

Conda 是科學和資料科學專案非常強大的工具,因為它能夠管理系統級軟體包,並在同一環境中提供多種平臺支援。然而,使用 conda 在安裝速度和記憶體佔用方面存在一些缺點,在某些情況下可能值得注意。

相比之下,UV 在安裝速度、低開銷以及保持 Python 生態系統是主要考慮因素的情況下尤其有用。此外,當專案沒有太多非 Python 依賴項時,使用 conda 仍然非常有用且有利。

UV與Poetry對比

Poetry 是一款現代化的一體化 Python 軟體包管理器,它以井然有序、規範的方式執行依賴項管理、專案腳手架搭建和軟體包釋出。

類別 優勢 劣勢
Poetry – 強大的依賴解析器可處理複雜版本衝突
– 內建專案腳手架促進清晰的專案結構
– 整合釋出到 PyPI,簡化部署
– 生成 poetry.lock 以實現可復現構建
– 約定化的結構可能降低靈活性
– 在大型專案上的依賴解析較慢
– 與基於 pip 的混合工作流存在相容性問題

Poetry的優勢

Poetry 的一些顯著優勢如下:

  • 強大的依賴解析器:Poetry 可以處理依賴項之間複雜的版本衝突,並允許依賴項順暢地連線。
  • 內建專案結構:Poetry 提供專案腳手架,並規定了專案結構(佈局),以便於維護一致的專案佈局。
  • 整合釋出:Poetry 包含將包釋出到 PyPI 的命令,使釋出變得輕而易舉。
  • 可重複性:生成 poetry.lock 檔案,以建立跨機器可重複的環境。

Poetry的劣勢

Poetry 的一些侷限性包括:

  • 固執己見的工作流程:Poetry 提供的約定可能會降低希望以自己的方式配置專案的開發人員的靈活性。
  • 較慢的依賴解析速度:Poetry 的依賴解析器可能比 UV 的慢,這意味著在大型專案中安裝依賴項可能需要更長的時間。
  • 相容性問題:Poetry 的約定有時會以修改所謂的“常規”基於 pip 的工作流程為代價,這有時會妨礙與其他工具的整合。

UV優於Poetry

以下是 UV 作為 Python 包管理器勝過 Poetry 的一些原因:

  • 極快的依賴解析:UV 透過其 Rust 實現利用快速計算來解析和安裝依賴項,從而在傳統 Python 包管理器的一小部分時間內建立環境。
  • 輕量高效:使用極少的系統資源即可快速構建環境。
  • 與標準 Python 包管理器的相容性:與 Poetry 強制開發人員按照其約定管理其 Python 環境和專案不同,UV 可以與現有的 requirements.txt 和 setup.py 完美相容,並且非常易於與 pip 和現有工具整合。
  • 靈活的專案結構:與 Poetry 不同,UV 不規定任何特定的格式,允許開發人員逐步採用,而無需改變他們的專案開發方式。

示例

建立專案並新增 Poetry 依賴項:

[poetry new myproject
cd myproject
poetry add requests flask
poetry install]

Poetry 管理專案結構和環境。使用 UV,你可以在已構建的專案中安裝依賴項:

uv install requests flask

UV 專注於快速安裝和環境管理,無需“規定”結構化佈局,因此其結構化操作非常容易逐步上手。

UV入門:簡易指南

您已決定嘗試使用 UV 作為您的下一個 Python 包管理器。這是一個明智的選擇,以下是具體操作方法。

步驟 1:安裝UV

您可以在 macOS 和 Linux 上透過終端使用 curl 安裝 UV:

curl -LsSf https://astral.sh/uv/install.sh | sudo sh

在 Windows 上,從 PowerShell 執行它(必須以管理員許可權執行):

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

您也可以使用 Homebrew 安裝它:

brew install uv

支援 pip 安裝,但不推薦使用。安裝完成後,請檢查版本是否正常:

uv version

步驟 2:啟動新專案

要使用 UV 啟動新專案,您需要導航到您現有的專案目錄或建立新的專案目錄:

mkdir myproject
cd myproject
uv init

例如,如果命令名為 uv init explore-uv,它將建立一個名為 explore-uv 的新專案。第一個命令將建立一個專案目錄 (explore-uv),並自動建立:

  • .gitignore
  • .python-version
  • README.md
  • hello.py(示例檔案)
  • pyproject.toml(專案後設資料和依賴項的主配置檔案)

步驟 3:向專案新增初始依賴項

UV 將建立環境和向專案新增依賴項合併到一個命令中:uv add

uv add scikit-learn xgboost

首次執行 uv add 命令時,UV 會在當前工作目錄中建立一個新的虛擬環境,並安裝您指定的依賴項。第二次執行 uv add 命令時,它將使用您現有的虛擬環境,並安裝或更新您請求的新軟體包。

UV 使用即時的現代依賴項解析器來管理依賴項,它會分析整個依賴關係圖並查詢相容的軟體包版本,以避免版本衝突。每次執行 add 命令後,UV 都會使用您安裝的版本更新您的 pyproject.toml 和 uv.lock 檔案,從而維護準確的記錄。

要刪除依賴項及其子依賴項,請執行 uv remove 命令:

uv remove scikit-learn

步驟 4:使用UV執行Python指令碼

安裝依賴項後,您可以使用 uv run 命令執行 Python 指令碼,而無需使用 python script.py 命令:

uv run hello.py

此命令確保指令碼在 UV 建立的專案虛擬環境中執行。

使用UV管理Python版本

以下是 UV 流線與 Python 版本協同工作的一些方法。

列出現有的Python版本

UV 可以檢測您計算機上現有或已安裝的 Python 版本:

uv python list --only-installed

此命令將顯示 UV 找到的所有 Python 版本的列表,包括透過 Conda 或 Homebrew 安裝的版本。

更改當前專案的Python版本

您可以隨時為 UV 專案切換 Python 版本,只要新版本滿足 pyproject.toml 檔案中的 require-python 規範(例如,requires-python = “>=3.9”)。

設定 Python 版本:

uv python use 3.11

這會將 Python 版本嵌入到 .python-version 中,並保持一致性。如果找不到請求的版本,UV 會下載並安裝到 ~/.local/share/uv/python 中。然後,UV 會在專案目錄中建立一個新的 venv 檔案並替換舊版本。更新 Python 版本後,您可能需要重新安裝依賴項:

uv pip install -e .

如果遇到與“許可權被拒絕”相關的錯誤,您可能需要使用 sudo (macOS/Linux) 或以管理員身份執行命令提示符 (Windows)。更好的選擇是更改 UV 主目錄的所有權:

sudo chown -R $USER ~/.local/share/uv # macOS or Linux

檢查活動版本

uv python --version

瞭解UV工具

UV 工具還提供介面來管理以命令列工具形式暴露的 Python 軟體包(例如 black、flake8、pytest 等)。

Black 是一款流行的 Python 程式碼格式化程式,可以自動重新格式化您的程式碼,使其遵循一致的風格,從而提高可讀性並在整個專案中保持統一的程式碼風格。

uv tool run 命令指示 UV 執行一個工具,black 是工具名稱(Python 程式碼格式化程式)。hello.py 是要格式化的目標檔案。此命令會在您的 hello.py 檔案上執行 Black,並根據 Black 的樣式規則自動對其進行格式化。

使用 uv tool run 命令:

uv tool run black hello.py

使用更短的uvx命令:

uvx black hello.py

執行這些命令時,UV 會在其快取中建立一個臨時虛擬環境,安裝並執行該工具。這樣,您無需在專案的虛擬環境中安裝命令列工具,即可使用它們,從而提高執行速度並清理專案依賴項。清除 UV 快取後,這些快取環境也會自動清理,非常適合偶爾使用開發工具。

UV中的鎖定檔案是什麼?

鎖定檔案 (uv.lock) 是 UV 依賴項管理的重要組成部分。每次執行 UV add 命令時,UV 都會建立和/或更新 uv.lock 檔案。uv.lock 檔案:

  • 跟蹤並記錄所有依賴項及其子依賴項的確切版本。
  • 透過在不同環境之間“鎖定”依賴項版本,實現可重複的構建。
  • 透過保持一致的軟體包版本,有助於防止“依賴地獄”。
  • 由於 UV 可以使用已鎖定的版本,而無需再次解析依賴項,因此可以加快安裝速度。

UV 會自動跟蹤鎖定檔案,您應該將其簽入版本控制,以確保整個開發團隊的依賴項版本保持一致。

鎖定檔案與requirements.txt

鎖定檔案和 requirements.txt 都處理依賴項,但它們的用途不同:

特性 uv.lock requirements.txt
可復現性 低至中等
生成方式 UV 解析器自動生成 手動或 pip freeze
可編輯性 否(自動生成)

前者,即 Lock 檔案,是開發的重要組成部分,因為它們有助於建立可重複的構建。requirements.txt 檔案比 lock 檔案簡單一些,通常只包含直接依賴項,因為它們在 Python 工具中被更廣泛地識別,並且可以作為與不使用 UV 的終端使用者共享/部署程式碼的一種方式。您可以使用 UV lock 檔案進行開發,並在部署時生成如下的 requirements.txt 檔案來維護兩者:

uv export -o requirements.txt

使用UV進行高階依賴管理

UV 提供了完善的依賴管理方法:

更新依賴項

add 命令可用於更新、更改約束或指定現有依賴項的確切版本:

安裝最新版本:

uv add requests

安裝特定版本:

uv add requests=2.1.2

改變約束邊界:

uv add 'requests<3.0.0'

使依賴關係特定於平臺:

uv add 'requests; sys_platform="linux"'

新增可選依賴項

可選依賴項是指核心功能不需要,但特定功能(例如 Pandas 的 Excel 或 Plot 附加功能)需要的軟體包。

首先,安裝核心軟體包:

uv add pandas

然後,新增其可選依賴項:

uv add pandas --optional plot excel

這些將在您的 pyproject.toml 中的 [project.optional-dependencies] 下列出。

依賴項組

依賴項組允許您組織依賴項(例如,開發、測試和文件依賴項),以將生產依賴項分開。

要將新的依賴項安裝到特定組中,您可以使用 –group 標誌:

uv add --group group_name package_name

使用者可以使用 –group、–only-group 和 –no-group 標誌來進一步控制安裝哪些組。

從PIP和Virtualenv切換到UV

從 pip 和 Virtualenv 遷移到 UV 幾乎是無縫的。這是因為 UV 的構建遵循現有的 Python 打包標準。

轉換現有的Virtualenv專案

如果您有一個現有專案:

pip freeze > requirements.txt

接下來,您將在同一目錄中啟動一個新的 UV 專案:

uv init.

現在您可以從需求檔案安裝依賴項:

uv pip install -r requirements.txt

替換常用的pip/virtualenv命令

以下是替換常用 pip/virtualenv 命令的快速參考:

pip/virtualenv 命令 UV 對應命令
python -m venv .venv uv venv
pip install package uv add package
pip install -r requirements.txt uv pip install -r requirements.txt
pip uninstall package uv remove package
pip freeze uv pip freeze
pip list uv pip list

遷移完成後,您可以安全地刪除舊的虛擬環境目錄。如果您發現需要回退到傳統的 pip 命令,可以隨時使用 UV 內建的 pip 相容層。

小結

UV 在眾多 Python 包管理器中脫穎而出,與之前的工具相比,它提供了一種現代、快速且高效的包管理替代方案。UV 的主要優勢包括:

  • 卓越的效能(比 pip 快 10 到 100 倍)。
  • 相容當前的 Python 打包標準。
  • 內建虛擬環境支援。
  • 極其高效的依賴項解析和鎖檔案支援。
  • 記憶體佔用和資源消耗極小。

無論您是啟動一個全新的專案還是升級現有專案,UV 都是一個可靠的解決方案,可以改善您的 Python 開發工作流程。由於它與現有工具和流程相容,因此對於希望在不中斷工作流程的情況下將其開發工具鏈帶入 21 世紀的開發者來說,這是一個輕鬆的決定。

作為開發者,我們生活在一個不斷發展的環境中。像 UV 這樣的工具就是 Rust 等現代語言如何提升開發者體驗的典範。同時,它還保留了 Python 開發者所依賴的易用性和可訪問性。

既然您已經瞭解了 UV 作為 Python 包管理器的顯著優勢,不妨在您的下一個專案中嘗試一下。請務必檢視官方 GitHub 程式碼庫,瞭解最新更新或貢獻。此外,請與開發社羣分享您的經驗,以幫助擴大 UV 的採用率並促進其未來的增強功能。

評論留言