Pipenv ユーザーのための uv 入門

記事タイトルとURLをコピーする

はじめに

サーバーワークスの宮本です。急激に冷え込んで来ましたね。今年こそはエアコン以外の暖房器具を導入したいと考えているところです。 さて、今回は Python の依存管理ツールについてのお話です。個人的にはこれまで Pipenv を使用していたのですが、uv へ移行する機運が高まって来たため、Pipenv ユーザー観点で uv を使うための情報を整理してみました。

対象読者

  • Pipenv を現在使っている方

書かないこと

  • 既存 Pipenv プロジェクトの uv 移行方法(筆者も試せていないため)

uv とは

docs.astral.sh

ASTRAL が開発する Python のランタイム・依存管理ツールです。主に以下のような特徴があります。

  • pip より 10 〜 100 倍早い
  • Python ランタイムの管理が可能
  • Cargo スタイルのプロジェクト管理

グローバルモジュールキャッシュで無駄な再ダウンロード、ビルドを避けていること、また Rust で書かれていることが早さの理由のようです。 また、ASTRAL は Python のリンター・フォーマッターである ruff の開発でも知られています。

インストール

早速試してみましょう。uv のインストールは以下コマンドで可能です。

$ curl -LsSf https://astral.sh/uv/install.sh | sh

# Homebrew
$ brew install uv

$ uv version
uv 0.5.3

ref. Installation

よく使うコマンドの対応

対応表

いきなりですがこちらがよく使うコマンドの対応表です。こちらを足がかりにしつつ、細かいオプションは調べていくと良いかと思います。

用途 Pipenv uv
Python ランタイムの管理 別ツールが必要 uv python
プロジェクトの初期化 pipenv --python uv init
仮想環境の有効化 pipenv shell source .venv/bin/activate
依存ライブラリの追加 pipenv install uv add
依存ライブラリの削除 pipenv uninstall uv remove
ロックファイルの内容で仮想環境を更新 pipenv sync uv sync
仮想環境の削除 pipenv --rm rm -rf .venv
依存関係の可視化 pipenv graph uv tree
requirements.txt の生成 pipenv requirements uv export
タスクランナー Pipfile に定義して pipenv run xxx 未対応

※ あくまで大まかな対応関係ですので、完全な互換性はないことにご注意ください

以降、各コマンドの簡単な解説・比較です。

Python ランタイムの管理

Pipenv

Pipenv にはこの機能はありません。pyenvmise など、別ツールを利用して管理されているのではないでしょうか。

uv

一方、uv にはランタイム管理機能があります。1つのツールで管理できて便利ですね。

# インストール可能なランタイム一覧を表示
$ uv python list
cpython-3.13.0+freethreaded-linux-x86_64-gnu    <download available>
cpython-3.12.7-linux-x86_64-gnu                 <download available>
cpython-3.11.10-linux-x86_64-gnu                <download available>
cpython-3.10.15-linux-x86_64-gnu                <download available>
cpython-3.9.20-linux-x86_64-gnu                 <download available>
cpython-3.9.16-linux-x86_64-gnu                 /usr/bin/python3.9
cpython-3.9.16-linux-x86_64-gnu                 /usr/bin/python3 -> python3.9
cpython-3.9.16-linux-x86_64-gnu                 /usr/bin/python -> /usr/bin/python3
cpython-3.9.16-linux-x86_64-gnu                 /bin/python3.9
cpython-3.9.16-linux-x86_64-gnu                 /bin/python3 -> python3.9
cpython-3.9.16-linux-x86_64-gnu                 /bin/python -> /usr/bin/python3
cpython-3.8.20-linux-x86_64-gnu                 <download available>
cpython-3.7.9-linux-x86_64-gnu                  <download available>
pypy-3.10.14-linux-x86_64-gnu                   <download available>
pypy-3.9.19-linux-x86_64-gnu                    <download available>
pypy-3.8.16-linux-x86_64-gnu                    <download available>
pypy-3.7.13-linux-x86_64-gnu                    <download available>

--all-versions オプションでパッチバージョンを含めて一覧表示が可能です。

# パッチバージョン含めて一覧表示
uv python list --all-versions
cpython-3.13.0+freethreaded-linux-x86_64-gnu    <download available>
cpython-3.12.7-linux-x86_64-gnu                 <download available>
cpython-3.12.6-linux-x86_64-gnu                 <download available>
cpython-3.12.5-linux-x86_64-gnu                 <download available>
cpython-3.12.4-linux-x86_64-gnu                 <download available>
cpython-3.12.3-linux-x86_64-gnu                 <download available>
cpython-3.12.2-linux-x86_64-gnu                 <download available>
cpython-3.12.1-linux-x86_64-gnu                 <download available>
cpython-3.12.0-linux-x86_64-gnu                 <download available>
cpython-3.11.10-linux-x86_64-gnu                <download available>
# 以下略

uv python install でインストールします。

$ uv python install 3.9.16
Installed Python 3.9.16 in 2.44s
 + cpython-3.9.16-linux-x86_64-gnu

所要時間は 2.44 秒でした。他ツールとは比較していませんが、かなり早い方なのではないでしょうか。

ref. uv python

プロジェクトの初期化

Pipenv

Pipenv の場合、以下要領で初期化します。

$ mkdir pipenv-sample && cd $_
$ pipenv --python 3.9
# 中略
Creating a Pipfile for this project...

$ ls -1a
Pipfile
.venv

通常、仮想環境 .venv ディレクトリは ~/.local/share/virtualenvs/ 配下に作成されますが、環境変数 PIPENV_VENV_IN_PROJECTtrue に設定しておくとプロジェクトディレクトリに作成されます。 Pipfile の内容は以下の通りです。

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]

[dev-packages]

[requires]
python_version = "3.9"
python_full_version = "3.9.16"

uv

uv の場合は以下の通りです。

$ mkdir uv-sample && cd $_
$ uv init --name uv-sample --python 3.9
Initialized project `uv-sample`

$ ls -1a
hello.py
pyproject.toml
.python-version
README.md

ref. uv init

pyproject.toml の内容は以下の通りです。pyproject.toml は、PEP 518, PEP 621 で定義されたツール類向けの標準仕様です。 ref. pyproject.toml

[project]
name = "uv-sample"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.9"
dependencies = []

.python-version を自動生成して当該プロジェクトの Python バージョンを固定します。

$ cat .python-version
3.9

仮想環境はこの時点では作成されず、uv venv コマンド、または後述する uv adduv sync コマンド等を実行するタイミングで作成されます。

$ uv venv
Using CPython 3.9.16
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate

ref. uv venv

仮想環境の有効化

Pipenv

Pipenv には専用のコマンドがあります。

# 有効化
$ pipenv shell
Launching subshell in virtual environment...
 source /home/cloudshell-user/.local/share/virtualenvs/pipenv-sample-XXl3OgW0/bin/activate

# 無効化
$ deactivate

uv

専用のコマンドはなく、以下の通り通常の仮想環境有効化コマンドを使用します。

# 有効化
$ source .venv/bin/activate

# 無効化
$ deactivate

依存ライブラリの追加

Pipenv

$ pipenv install requests
Pipfile.lock not found, creating...
Locking [packages] dependencies...
Locking [dev-packages] dependencies...
Updated Pipfile.lock (24bce4fec4ccd7c39ec2e5220167533ac84fa6142b0f63d8b59fb2cd51208e4a)!
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
Installing requests...
✔ Installation Succeeded
# 以下略

$ ls -1a
Pipfile
Pipfile.lock
.venv

lock ファイルが作成され、仮想環境内にライブラリがインストールされます。

uv

$ uv add requests
Resolved 6 packages in 32ms
Installed 5 packages in 7ms
 + certifi==2024.8.30
 + charset-normalizer==3.4.0
 + idna==3.10
 + requests==2.32.3
 + urllib3==2.2.3

$ ls -1a
hello.py
pyproject.toml
.python-version
README.md
uv.lock
.venv

ロックファイル (uv.lock) が作成され、仮想環境内にライブラリがインストールされます。依存関係の解決とインストールで 39 ms とかなり早いです。

[project]
name = "uv-sample"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.9"
dependencies = [
    "requests>=2.32.3",
]

pyproject.tomldependencies 内に記載されます。

PEP 508 準拠のバージョン指定も可能です。

$ uv add requests==2.32.2
$ uv add requests>=2.32.2
$ uv add requests>2
$ uv add requests<=2.32
$ uv add requests<2.32.2
$ uv add requests">=1.2.2,<2.0.0"

開発時のみ使用する依存は --dev オプションをつけてインストールします。

$ uv add --dev ruff

dependency-groups.dev に追加されます。

[project]
name = "uv-sample"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.9"
dependencies = [
    "requests>=1.2.2,<2.0.0",
]

[dependency-groups]
dev = [
    "ruff>=0.7.4",
]

ref. uv add

依存ライブラリの削除

Pipenv

$ pipenv uninstall requests

uv

$ uv remove requests

ref. uv remove

ロックファイルの内容で仮想環境を更新

既存プロジェクト参画時など、既に存在するロックファイルに合わせて仮想環境を作成したい場合に使用するコマンドです。

Pipenv

$ pipenv sync [--dev]

uv

# DevDependencies も含めて同期
$ uv sync

# Dependencies のみ同期
$ uv sync --no-dev

# DevDependencies のみ同期
$ uv sync --only-dev

ref. uv sync

仮想環境の削除

なにやら挙動がおかしいぞ... という時に仮想環境を削除して作り直したいことがあります。

Pipenv

$ pipenv --rm

uv

専用のコマンドは見つけられませんでした。仮想環境のディレクトリを削除します。

$ rm -rf .venv

依存関係の可視化

Pipenv

$ pipenv graph
requests==2.32.3
├── certifi 
├── charset-normalizer 
├── idna 
└── urllib3 
ruff==0.7.4

uv

$ uv tree
Resolved 7 packages in 1ms
uv-sample v0.1.0
├── requests v2.32.3
│   ├── certifi v2024.8.30
│   ├── charset-normalizer v3.4.0
│   ├── idna v3.10
│   └── urllib3 v2.2.3
└── ruff v0.7.4 (group: dev)

ref. uv tree

requirements.txt の生成

Pipenv

$ pipenv requirements > requirements.txt

uv

以下コマンドで requirements.txt が出力できます。

$ uv export --output-file requirements.txt

反対に既存の requirements.txt を取り込む場合は以下の通りです。

$ uv add -r requirements.txt 

ref. uv export

タスクランナー

Pipenv

Pipenv では、Pipfile に以下のように定義すると...

[scripts]
lint = "flake8"

pipenv run コマンドとして実行が可能です。

$ pipenv run lint

uv

現状タスクランナー相当の機能は無さそうです。issue にて議論はされているようです。 make 等、別のツールで代替が必要です。

まとめ

Pipenv で実施していたことは uv でも概ね対応していることが分かりました。速さは正義、ということで個人的には今後数年は主流として使われていくのではないかと思います。(その先はわかりません... w それでは良い Python ライフを!