使用 uv 建立 Python 專案環境

使用 uv 建立 Python 專案環境:快速、乾淨、可重現

uv 是由 Astral 開發的超高速 Python 工具,可取代 pip, venv, pyenv, poetry 的安裝、建立虛擬環境、Python 版本管理、專案管理等功能,支援 pyproject.toml 的依賴管理,是現代化 Python 專案環境建置的利器。

這篇筆記整理了使用 uv 建立虛擬環境、安裝套件、管理依賴的完整流程,適合給想建立 快速、可重現、乾淨的 Python 開發環境 的工程師參考。


🛠 安裝 uv

pip install uv

或使用 Homebrew (macOS/Linux):

brew install astral-sh/tap/uv

🚀 建立 Python 專案環境流程

uv init .
uv venv
uv add django

步驟說明:

指令 功能說明
uv init . 初始化 pyproject.toml,設定專案 metadata
uv venv 建立虛擬環境 .venv
uv add django 安裝 Django 並加入 pyproject.toml + uv.lock

✅ 安裝的套件會被記錄到 pyproject.toml 中,並且自動鎖定到 uv.lock,確保環境重現性。


✅ 常用 uv 指令總覽

功能 指令範例 說明
安裝套件 uv add requests 加入正式依賴
安裝 dev 套件 uv add --dev ruff 加入開發用依賴(如 Linter)
查看已安裝套件 uv pip list 顯示虛擬環境內的套件
執行 Python 程式 uv run python app.py 使用虛擬環境執行程式
移除套件 uv remove requests 從依賴清單和虛擬環境中移除套件
同步環境 uv sync 根據 lock 檔安裝所有依賴

🔄 清除並重建虛擬環境

如果想清除多餘的依賴或重建乾淨環境:

rm -rf .venv uv.lock
uv venv
uv sync

這會根據目前 pyproject.toml 重建乾淨環境,不殘留任何「孤兒套件」。


🐍 指定 Python 版本(選擇性)

檢查可安裝哪些 Python 版本並安裝

uv python list
uv python install 3.12

切換 Python 版本

uv python pin 3.12
# pyproject.toml
[project]
requires-python = ">=3.10"

如需使用指定的 Python 安裝版本建構 .venv,可這樣設定:

PYTHON=/usr/local/bin/python3.10 uv venv

比較 pyenv 跟 uv 兩種 Python 版本管理

工具 用途 影響範圍
pyenv 控制 整個系統或目錄的 Python 版本 全域或目錄切換
uv 在虛擬環境中自動管理 Python 版本 只限 .venv

🧪 執行與開發(不用手動 activate 虛擬環境!)

uv run python manage.py runserver  # 執行 Django 開發伺服器
uv run pytest                      # 執行測試

uv run 會自動使用 .venv/bin/python,不需手動 source .venv/bin/activate


📌 範例 pyproject.toml

[project]
name = "my-uv-app"
version = "0.1.0"
description = "A Python app using uv for dependency management"
requires-python = ">=3.10"

[tool.uv.dependencies]
django = "*"

[tool.uv.dev-dependencies]
ruff = "*"

指令比較

動作 會寫入 pyproject.toml 會更新 uv.lock 安裝到虛擬環境
uv add flask ✅ 是 ✅ 是 ✅ 是
uv pip install ❌ 否 ❌ 否 ✅ 是
uv lock ❌ 否 ✅ 是(根據 pyproject.toml) ❌ 否
uv sync ❌ 否 ❌ 否 ✅ 是(根據 uv.lock)

🧠 小結

  • uv 是快速又現代的 Python 專案工具。
  • pip 不同,uv add管理專案依賴,自動記錄與鎖定。
  • 搭配 pyproject.toml + uv.lock 可以輕鬆建立 一致可重現 的環境。
  • uv run 取代虛擬環境的啟動/關閉流程,開發更方便。