Zenn
Open4

パッケージマネージャーuvへの移行ガイド

diiadiia

pythonのパッケージマネージャーuvがデファクトになりつつある。
各パッケージ管理ツールからuvに移行するためのツールmigrate-to-uvがリリースされていたので試してみる。

https://github.com/mkniewallner/migrate-to-uv
https://mkniewallner.github.io/migrate-to-uv/

執筆時点2025/1/13時点のバージョンは0.3.0、サポートしている移行ツールは以下の通り。

  • pip
  • pip-compile
  • pipenv
  • portry

uvが環境に導入されていない場合は、以下手順でuvをインストールする。

https://docs.astral.sh/uv/getting-started/installation/

uvが入ればmigrate-to-uvは簡単にインストールできる。

uv tool install migrate-to-uv@0.3.0
 + migrate-to-uv==0.3.0
Installed 1 executable: migrate-to-uv
diiadiia

pip -> uv

本番環境、開発環境用のrequirements.txtがある場合を想定。

requirements.txt(本番環境用の依存関係)
langchain
langsmith
langchain_openai
langchain_community
requirements-dev.txt(開発環境用の依存関係)
ipykernel

2種類の依存関係をソースに移行処理を実行する。

uvx migrate-to-uv --requirements-file requirements.txt --dev-requirements-file requirements-dev.txt
Successfully migrated project from pip to uv!

生成されたpyproject.tomlは以下の通り。
問題なく変換できてそうだが、以下は注意が必要

  • [project.name]が空なので追記が必要
  • [project.requires-python]が空なので指定した方が良い
  • [tool.uv.package]がfalseなので依存関係のみインストールされ、実装したコードはインストールされない
    • オプションの説明は公式docsを参照のこと
[project]
name = ""
version = "0.0.1"
dependencies = [
    "langchain",
    "langsmith",
    "langchain-openai",
    "langchain-community",
]

[dependency-groups]
dev = ["ipykernel"]

[tool.uv]
package = false
diiadiia

poetry -> uv (ケース1: 依存関係がシンプルな場合)

poetryはバージョン 2.0未満を想定し、以下のpyproject.tomlを変換する。

pyproject.toml(poetry)
[tool.poetry]
name = "app"
version = "0.1.0"
description = ""
authors = []

[tool.poetry.dependencies]
python = "^3.10"
langchain = "*"
langsmith = "*"
langchain-openai = "*"
langchain-community = "*"

[tool.poetry.group.dev.dependencies]
ipykernel = "*"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

pip -> uvのケースと同様に変換してみる。

uvx migrate-to-uv
Successfully migrated project from poetry to uv!

以下が変換後のpyproject.toml。
[project.requires-python]もしっかり読み取られ、開発時の依存関係についてのマッピングも問題なく完璧に移行できている。

ビルドバックエンドがhatchingになっているので目的や好みに合わせて適宜修正すれば良い。

pyproject.toml(uv)
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "app"
version = "0.1.0"
description = ""
authors = []
requires-python = "~=3.10"
dependencies = [
    "langchain",
    "langsmith",
    "langchain-openai",
    "langchain-community",
]

[dependency-groups]
dev = ["ipykernel"]
diiadiia

poetry -> uv (ケース2: 環境マーカーと外部インデックスを使用する場合)

先ほどの依存関係は簡単すぎる。
もう少し現実的なケースとして、pytorchをmacではCPU版、それ以外のOSではCUDA 12.1版を使用するpyproject.tomlを変換してみる。

pyproject.toml(poetry)
[tool.poetry]
name = "app"
version = "0.1.0"
description = ""
authors = []

[tool.poetry.dependencies]
python = "^3.10"
requests = "*"
torch = [
  {version = "2.5.1", markers = "sys_platform == 'darwin'"},
  {version = "2.5.1", markers = "sys_platform != 'darwin'", source = "pytorch-cu121"}
]
torchvision = [
  {version = "0.20.1", markers = "sys_platform == 'darwin'"},
  {version = "0.20.1", markers = "sys_platform != 'darwin'", source = "pytorch-cu121"}
]

[[tool.poetry.source]]
name = "pytorch-cu121"
url = "https://download.pytorch.org/whl/cu121"
priority = "explicit"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
uvx migrate-to-uv
Successfully migrated project from poetry to uv!

環境マーカーの条件指定、インデックスの設定が問題なく変換できている。

pyproject.toml(uv)
[project]
name = "app"
version = "0.1.0"
description = ""
authors = []
requires-python = "~=3.10"
dependencies = [
    "requests",
    "torch",
    "torchvision",
]

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

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

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
ログインするとコメントできます