十年來Python生態最好工具,引爆全社區的uv到底是什么?
uv,我們也該報道一下它了。
這個用 Rust 寫的 Python 包和項目管理工具近日在 Hacker News 上再次引發廣泛關注。原因很簡單,來自英國的天文學家和科學傳播者 Emily L. Hunt 博士在自己的博客上發布了一篇文章,稱「uv 是近十年來 Python 生態系統發生的最好的事情」。
博客不長,但被分享到 Hacker News 后卻引發了廣泛共鳴和討論,也收獲了上千點贊(雖然很多討論的焦點是 Rust)。


不過在看這篇博客之前,我們先簡單了解一下 uv 這個項目本身。
簡單來說,uv 是一個面向 Python 生態系統的高速「一體化」工具,可用于包管理、環境管理、項目初始化、工具執行、Python 版本管理等。其由 Astral(同樣推出了知名工具 Ruff)開發,底層使用 Rust 語言實現,以追求極致性能。對于已有的工作流、pip、virtualenv、pipx、poetry 等工具,uv 提供極強的兼容性并且在某些場景下速度可提升 10–100 倍。

截至目前,該項目在 GitHub 已經收獲了超 7.1 萬 star!

- 項目:https://github.com/astral-sh/uv
- 文檔:https://docs.astral.sh/uv/
以下是 uv 的一些關鍵特性:
- ?? 一款工具即可取代 pip、pip-tools、pipx、poetry、pyenv、twine、virtualenv 等眾多工具。
- ?? 比 pip 快 10 到 100 倍。
- ??? 提供完善的項目管理功能,并支持通用鎖定文件(lockfile)。
- ?? 可直接運行腳本,并支持內聯依賴元數據。
- ?? 支持安裝和管理多個 Python 版本。
- ??? 可運行或安裝以 Python 包形式發布的命令行工具。
- ?? 內置兼容 pip 的接口,在保持熟悉命令行體驗的同時大幅提升性能。
- ?? 支持類似 Cargo 的工作區結構,輕松管理大型項目。
- ?? 磁盤占用高效,依賴可通過全局緩存實現去重。
- ? 無需預裝 Rust 或 Python,即可通過 curl 或 pip 安裝。
- ??? 兼容 macOS、Linux 和 Windows 系統。
接下來,我們就來看看為什么說「uv 是近十年來 Python 生態系統發生的最好的事情」。

- 博客標題:uv is the best thing to happen to the Python ecosystem in a decade
- 博客地址:https://emily.space/posts/251023-uv
都 2025 年了。難道安裝 Python、管理虛擬環境、在同事間同步依賴,還非得那么費勁嗎?
嗯... 真的不用!
最近,一款名為 uv 的杰出新工具橫空出世。它徹底革新了 Python 的安裝和使用方式,讓一切變得無比簡單。
uv 是一款免費的開源工具。它由 Astral 打造,這是一家小型創業公司,過去幾年一直在持續產出優秀的 Python 工具(比如大名鼎鼎的 linter Ruff)。uv 能做到:
- 為你安裝任意 Python 版本
- 安裝軟件包
- 管理虛擬環境
- 極速解決依賴沖突(這對大型項目至關重要)
最棒的是,在我看來,uv 在上述所有方面都比其他任何工具做得更好。
它的速度快得驚人。它由 Rust 語言編寫,并且幾乎兼容所有操作系統或平臺。
安裝 uv
uv 的安裝非常簡單。有幾種方法,但我認為最簡單的是這個單行命令。
對于 Linux 和 Mac 用戶:
curl -LsSf https://astral.sh/uv/install.sh | sh或者,Windows 用戶在 PowerShell 中使用:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"之后,你就可以通過 uv 命令來使用它了。
安裝 uv 不會搞亂你現有的任何 Python 環境。它是一個完全獨立的工具,所以你可以放心地安裝并試用。
管理項目的 Python
無論開發什么 Python 項目,使用虛擬環境都是一個好習慣。
虛擬環境能將不同項目的代碼和依賴相互隔離開。以我的經驗來看,盡早養成這個習慣能省去未來很多麻煩。
uv 天生就會使用虛擬環境。因此,一旦你開始用 uv,上手虛擬環境也會變得非常容易。
uv 會根據你當前目錄(或父目錄)中 pyproject.toml 文件的配置來構建 Python 環境。
pyproject.toml 文件是指定 Python 項目依賴的標準、現代格式。一個最精簡的 pyproject.toml 文件可能如下所示:
[project]
name = "my_project"
version = "1.0.0"
requires-python = ">=3.9,<3.13"
dependencies = [
"astropy>=5.0.0",
"pandas>=1.0.0,<2.0",
]簡而言之,它只需要指定使用哪個 Python 版本和一些依賴項。當然,加上項目名稱和版本號也是個好主意。
(補充一點:如果你的項目需要作為軟件包發布(例如發布到 pip 和 uv 用的 Python 軟件包索引 PyPI),pyproject.toml 文件是指定發布所需全部信息的現代方式。)
用 uv 創建新項目
要用 uv 啟動一個新 Python 項目,你可以運行:
uv init這個命令會為你創建一個新項目,包含 pyproject.toml、README.md 和其他重要的模板文件。
這個命令還有很多變種,比如 uv init --bare(只創建 pyproject.toml)和 uv init --package(設置一個新的 Python 包)等等。
我建議你運行 uv init --help 來查看所有選項。
當你(已經)有了 pyproject.toml 文件
一旦你初始化了項目,或者項目里已經有了 pyproject.toml 文件,使用 uv 就變得非常簡單。
你只需要在 pyproject.toml 文件所在的目錄中運行:
uv sync
這個命令(實際上,如果你還沒運行過,大多數 uv 命令都會)會執行以下操作:
- 自動安裝一個有效的 Python 版本。
- 在目錄下的 .venv 文件夾中安裝所有依賴,創建一個新虛擬環境。
- 在你的目錄中創建一個 uv.lock 文件。該文件會保存每個已安裝包的確切、平臺無關的版本。這意味著你的同事可以完全復刻你的 Python 環境。
原則上,你可以像激活其他工具創建的虛擬環境那樣「激活」這個新環境。
但最「uv 風格」的使用方式,是直接在任何命令前加上 uv run。uv run 會自動為你匹配正確的虛擬環境,并用它來執行你的命令。
例如,要運行一個腳本,你不再需要:
source .venv/bin/activate
python myscript.py你只需:
uv run myscript.py這樣做的效果是完全一樣的。
同理,要使用像 Jupyter Lab 這樣的「工具」,你也不需要先「激活」環境再單獨運行 jupyter lab。你只需在項目目錄中運行:
uv run jupyter lab添加依賴
你當然可以直接手動編輯 pyproject.toml 文件。uv 會檢測到變更并重新構建你項目的虛擬環境。
但 uv 也提供了更簡單的方式來添加依賴。你只需運行:
uv add numpy>=2.0這樣就可以添加一個包,并(像上面那樣)指定版本限制。
這個命令會自動為你修改 pyproject.toml 文件。uv add 功能也非常強大,支持從 git 或你電腦上的其他位置添加遠程依賴(但這里我就不展開了)。
鎖定 Python 版本
最后,我認為 uv 最有用的功能之一,是為你的項目鎖定一個特定的 Python 版本。
運行這個命令:
uv python pin 3.12.9這條命令會為你(以及其他任何使用 uv 的人)將當前項目精確鎖定到 Python 3.12.9 版本。
這意味著你真的可以在多臺機器間復制完全一致的 Python 安裝環境。
uvx:跳過以上所有步驟,立即運行工具!
但有時候,你可能只想快速運行一個工具。
比如,臨時用 Ruff 檢查下代碼,或者在沒有環境時啟動一個 Jupyter notebook 服務器,甚至只是想快速啟動一個裝了 pandas 的 IPython 會話來打開某個文件。
uv tool 命令(它的縮寫別名是 uvx)讓這一切變得異常簡單。
運行像下面這樣的命令:
uvx ruffuv 會自動下載你需要的工具,并在一個一次性虛擬環境中運行它。
一旦這個工具被下載過,uv 就會利用緩存,下次再運行就會快如閃電。
我有很多場合會用到這個功能。一個常見的場景是,快速啟動一個安裝了 pandas 的 IPython 會話(使用 --with 添加依賴),這樣我就可以快速打開并查看一個 parquet 文件。例如:
uvx --with pandas,pyarrow ipython或者,也許只是想啟動一個 Jupyter Lab 服務器,好讓我能快速打開學生發來的 Jupyter notebook:
uvx jupyter lab老實說,還有太多其他奇怪的、一次性的用例,uvx 都能派上用場。
我絲毫不會(因為總用虛擬環境)而感到不便,因為 uvx 總能在我需要時提供一張「萬能通行證」。
如果這還不能說服你:一些個人感想
我是在去年第一次發現 uv 的。
當時,我正和我們其他可愛的開發者們一起構建 The Astrosky Ecosystem。這是一個很棒的項目,旨在為天文學家們構建開源的在線社交媒體集成。
但我們有多個開發者,大家在不同的操作系統上異步工作。很快,管理 Python 安裝就成了一項艱巨的任務。
對我們而言,uv 是一個極其強大的簡化工具,我們已在整個技術棧中全面使用它。
作為開發者,我們現在終于能使用完全一致的 Python 安裝環境了。這一點尤其重要,因為我們用的一些半實驗性依賴,每個版本都有破壞性改動。
在 GitHub Actions,我們正計劃使用 uv 來快速構建 Python 環境并運行單元測試。
在生產環境中,uv 已經管理著我們所有服務器的 Python。
能夠確信,我們所有機器上的 Python 和軟件包安裝總能得到一致且正確的處理,這種感覺真是太棒了。
這就是為什么我說,uv 是近十年來 Python 生態系統發生的最好的事情。

你已經用上 uv 了嗎?對此有什么看法?

























