uv

uv是Python的包管理工具,它可以用来安装、升级、卸载Python包。使用uv可以大大方便项目的管理,他像npm一样建立了项目环境,但又采用软链接的形式减少了空间占用并加快了安装速度。使用uv是未来管理Python项目的趋势。

uv官方文档

uv常用命令

初始化项目

1
uv init --package

安装包

1
uv add <package-name>

卸载包

1
uv remove <package-name>

安装项目依赖

1
uv sync

运行项目

1
uv run <command>

查看项目依赖树

1
uv tree

构建项目

1
uv build

无外网使用

当我在服务器上使用uv时,我不能指望服务器有外网,所以我需要使用国内镜像源。

安装Python

1
export UV_PYTHON_INSTALL_MIRROR=https://proxy.pipers.cn/https://github.com/astral-sh/python-build-standalone/releases/download

换源

~/.config/uv目录下创建uv.toml文件,添加以下内容。

uv.toml
1
2
3
[[index]]
url = "https://pypi.tuna.tsinghua.edu.cn/simple/"
default = true

uv工具

nvitop

nvitop是一个用于监控NVIDIA GPU的工具,它可以显示GPU的使用情况。

安装命令

1
uv tool install nvitop

运行nvitop

1
nvitop

uv脚本

Python是一个脚本语言,而uv的脚本功能,使我深刻了解到了这一点。

编写uv脚本

src目录下创建utils/__init__.py文件,在__init__.py文件中编写功能脚本,实现与项目相关的功能。

例如,编写一个脚本,从pyproject.toml文件中提取依赖并写入requirements.txt文件中。

utils/__init__.py
1
2
3
4
5
6
7
8
9
10
def write_requirements():
"""
从 pyproject.toml 中提取依赖并写入 requirements.txt
"""
with open(ROOT / "requirements.txt", "w") as f:
for dep in config["project"]["dependencies"]:
f.write(dep + "\n")
with open(ROOT / "docs/requirements.txt", "w") as f:
for dep in config["dependency-groups"]["docs"]:
f.write(dep + "\n")

pyproject.toml文件中的project.scripts条目是项目的脚本入口,在其中添加utils/__init__.py文件中的函数。

pyproject.toml
1
2
[project.scripts]
requires = "utils:write_requirements"

执行脚本。

1
uv run requires

几个常用脚本

执行shell命令,并实时显示输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import subprocess


def run_command(command):
process = subprocess.Popen(
command,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, # 合并错误输出到标准输出
text=True, # 返回字符串而非字节
bufsize=1, # 行缓冲模式
shell=True, # Windows环境下添加,Linux环境删除
)
while True:
line = process.stdout.readline()
if not line:
break
print(line.strip())

读取并解析pyproject.toml文件,config中包含pyproject.toml的所有信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys
from pathlib import Path

FILE = Path(__file__).resolve()
ROOT = FILE.parents[2] # 项目根目录

if sys.version_info >= (3, 11):
# Python 3.11 或更高
import tomllib as tomli
else:
# Python 3.8 ~ 3.10
import tomli

with open(ROOT / "pyproject.toml", "rb") as f:
config = tomli.load(f)