Open1

uvでPythonのバージョンに合わせてインストールするライブラリのバージョンを変える

colum2131colum2131

Pythonのパッケージ管理ツールのuvには、PEP 508に基づいたDependency specificationの記述が可能です。

例えば、uvでPyTorchをインストールする場合はenvironment marker expressionの記法で、Linuxかそれ以外のOSかでインストールするPyTorchのindexを変更することが可能です[1]

pyproject.toml
[project]
name = "project"
version = "0.1.0"
requires-python = ">=3.12.0"
dependencies = [
  "torch>=2.6.0",
  "torchvision>=0.21.0",
]

[tool.uv.sources]
torch = [
  { index = "pytorch-cpu", marker = "sys_platform != 'linux'" },
  { index = "pytorch-cu124", marker = "sys_platform == 'linux'" },
]
torchvision = [
  { index = "pytorch-cpu", marker = "sys_platform != 'linux'" },
  { index = "pytorch-cu124", marker = "sys_platform == 'linux'" },
]

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

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

このマーカー式を用いることで、Pythonのバージョンごとのインストールするパッケージのバージョンを記述することができます。

実際に、Python 3.11であればnumpy<2.00、Python 3.12以上であればnumpy>=2.0.0をインストールするように記述してみましょう。

pyproject.toml
[project]
name = "project"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = [
    "numpy<2.0.0 ; python_version == '3.11'",
    "numpy>=2.0.0 ; python_version >= '3.12' "
]

uv python pin 3.11でPythonのバージョンを変更した後にuv syncをするとnumpy==1.26.4がインストールされ、uv python pin 3.12の後にuv syncをするとnumpy==2.2.5がインストールされることが確認できます。

なお、この記事でのuvのバージョンはv0.6.14です。

脚注
  1. Configuring accelerators with environment markers - Using uv with PyTorch ↩︎