Do1e

Do1e

github
email

使用 uv 管理 Python 環境

此文由 Mix Space 同步更新至 xLog
為獲得最佳瀏覽體驗,建議訪問原始鏈接
https://do1e.cn/posts/citelab/how-to-use-uv


前言#

大家都在宣傳 uv 的快(UV:Python 包管理神器 - 比 pip 快 100 倍),不過針對我們實驗室可能需要在多個機器之間遷移 Python 環境的情況,uv 復現環境的便利性同樣也值得關注。

雖然已經在盡力向同門們推薦使用 uv,但大家對 conda 的依賴還是很深,也不願意嘗試新的工具。
因此還是決定寫一篇教程,介紹一下 uv 的使用方法,稍微推動一下實驗室環境管理的變革好了。

安裝 uv#

官方文檔

Windows 上我還是更推薦使用 winget 安裝:

winget install astral.uv

Linux/macOS 上則可以參考官方文檔使用 curl/wget 安裝:

curl -LsSf https://astral.sh/uv/install.sh | sh
# 或者
wget -qO- https://astral.sh/uv/install.sh | sh

初始化 uv 環境#

如果需要初始化一個新項目,可以在你的 workspace 目錄下運行:

uv init [project-name]
cd [project-name]

或者需要將已有的 Python 項目遷移到 uv 環境下,可以在項目目錄下運行:

cd [project-name]
uv init

此時項目目錄中會新建下述文件:

.git
.gitignore
main.py
pyproject.toml
.python-version
README.md
  1. .git.gitignoreREADME.md 就不用解釋了
  2. main.py 是一個示例 Python 文件,不需要可以直接刪了
  3. pyproject.toml 是 Python 項目的配置文件裡面記錄了項目的元數據和依賴等信息,內容大致如下:
    [project]
    name = "test-project"
    version = "0.1.0"
    description = "在此添加您的描述"
    readme = "README.md"
    requires-python = ">=3.12"
    dependencies = []
    
  4. .python-version 用於指定當前項目的 Python 版本

指定 Python 版本#

編輯 pyproject.toml 文件中的 requires-python 字段,指定當前項目所需的 Python 版本,例如:==3.12>=3.12 等。

然後運行以下命令安裝指定版本的 Python:

uv python pin 3.12

創建虛擬環境#

uv venv

此命令會在當前項目目錄下創建一個虛擬環境,文件夾為 .venv,之後可以參考其輸出信息激活虛擬環境,如:

source .venv/bin/activate
# 或者在 Windows 上
.venv\Scripts\activate

管理項目依賴#

基本用法#

需要安裝新的依賴時,可以使用以下命令:

uv add [package-name]

實際上就是將之前 pip install 替換為 uv add 即可,但該命令除了將依賴安裝到虛擬環境中,還會自動將依賴信息寫入 pyproject.toml 文件中的 dependencies 字段,並且更新 uv.lock 鎖文件以確保依賴版本的可復現性。uv.lock 文件不需要手動編輯,但是對環境復現相當重要,不要把它放進 .gitignore

比如說安裝 requests 後,pyproject.toml 中只會多一條 requests 依賴,而 uv.lock 中則會詳細記錄 requests 及其所有子依賴的具體版本信息,使用 uv tree 命令可以查看依賴樹:

> uv tree
Resolved 6 packages in 0.75ms
test-project v0.1.0
└── requests v2.32.5
    ├── certifi v2025.11.12
    ├── charset-normalizer v3.4.4
    ├── idna v3.11
    └── urllib3 v2.6.1

如果不需要某個依賴了,可以使用以下命令將其卸載:

uv remove [package-name]

儘可能嚴格使用 uv 命令管理環境,雖然也提供了 uv pip 命令來兼容 pip 的用法,但該命令不會更新 pyproject.tomluv.lock 文件,將導致環境不可復現的問題。

鏡像源#

如果需要換 Pypi 鏡像源,可在 pyproject.toml 文件中添加如下內容(以南大鏡像源為例):

[[tool.uv.index]]
name = "nju-mirror"
url = "https://mirror.nju.edu.cn/pypi/web/simple"
default = true

pip 中的 index-url#

部分包會在自己的 PyPI 鏡像源上發布,比如 torch 的 pip 安裝命令(參見 torch 官方文檔)如下:

pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cu130

需要參考 Using uv with PyTorch 將下述內容加入 pyproject.toml 文件中:

[[tool.uv.index]]
name = "pytorch-cu130"
url = "https://download.pytorch.org/whl/cu130"
explicit = true

[tool.uv.sources]
torch = [
  { index = "pytorch-cu130", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
]
torchvision = [
  { index = "pytorch-cu130", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
]

否則將不會安裝 CUDA 版本的 torchtorchvision,而是安裝 CPU 版本。

這裡首先定義了一個名為 pytorch-cu130 的索引源,url 指定為上述 torch 文檔中給出的 --index-url,不過更推薦使用南大鏡像源的 https://mirror.nju.edu.cn/pytorch/whl/cu130
然後在 tool.uv.sources 中指定了 torchtorchvision 這兩個包需要從該索引源安裝(注:marker 指定了僅當操作系統是 Linux 或 Windows 時,才使用 pytorch-cu130 索引。對於其他操作系統,如 macOS,此配置會被忽略,依然使用默認源)。

復現環境#

當你需要在另一台機器上復現當前項目的 Python 環境時,只需克隆項目代碼後,運行以下命令:

uv sync

如果想要實現在另一個項目中復現相同的環境,則可以複製 pyproject.tomluv.lock.python-version 文件到目標項目目錄下,更新 pyproject.toml 中的項目信息,然後運行同樣的命令:

uv sync

構建和發布包#

如果你是在寫一個可供其他人安裝的 Pypi 包,你還需要考慮哪些依賴是開發時依賴,哪些是運行時依賴,開發依賴需要使用 uv add --dev [package-name] 命令安裝。

之後還需要補充 pyproject.toml 文件中的項目信息,比如作者、許可證,以及構建信息等,考慮到搞科研的大部分時候並不會發布包,這裡就不展開講了,可以參考下述內容進行理解:

[project]
name = "NJUlogin"
version = "3.6.1"
description = "南京大學登錄模塊,可用於登錄各種校園網站"
authors = [{ name = "Do1e", email = "[email protected]" }]
readme = "README.md"
requires-python = ">=3.10,<4.0"
dependencies = [
    "requests>=2.32.0",
    "pillow>=11.0.0",
    "numpy>=2.0.0",
    "lxml>=5.3.0",
    "pycryptodome>=3.21.0",
    "onnxruntime>=1.20.0",
    "cryptography>=43.0.0",
]
classifiers = [
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
]


[project.scripts]
NJUlogin = "NJUlogin.__main__:main"

[tool.setuptools.packages.find]
include = ["NJUlogin", "NJUlogin.*"]

[project.urls]
Homepage = "https://github.com/Do1e/NJUlogin"
Repository = "https://github.com/Do1e/NJUlogin"

[dependency-groups]
dev = [
    "pre-commit>=4.3.0",
    "ruff>=0.14.6",
]

[[tool.uv.index]]
url = "https://mirror.nju.edu.cn/pypi/web/simple"
publish-url = "https://upload.pypi.org/legacy/"
default = true

[tool.ruff]
line-length = 100

[tool.ruff.lint]
ignore = ["C901", "E501", "E721", "E741", "F402", "F823"]
select = ["C", "E", "F", "I", "W"]

[tool.ruff.lint.isort]
lines-after-imports = 2

[tool.ruff.format]
quote-style = "double"
indent-style = "space"
skip-magic-trailing-comma = false
line-ending = "auto"

[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"

[tool.uv]
package = true

之後即可,使用以下命令構建和發布包:

uv build
uv publish

其他實用命令#

  1. uv cache clear:清除 uv 緩存,釋放其佔用的磁碟空間
  2. uv tree:查看當前項目的依賴樹
  3. uv run main.py:等價於激活虛擬環境後運行 python main.py,可以用來運行項目中的 Python 腳本
  4. uvx [script-name]:運行工具,有些 Python 包會提供命令行工具,可以使用 uvx 命令運行它們,例如 uvx NJUlogin -h
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。