はじめに
サーバーワークスの宮本です。急激に冷え込んで来ましたね。今年こそはエアコン以外の暖房器具を導入したいと考えているところです。 さて、今回は Python の依存管理ツールについてのお話です。個人的にはこれまで Pipenv を使用していたのですが、uv へ移行する機運が高まって来たため、Pipenv ユーザー観点で uv を使うための情報を整理してみました。
対象読者
- Pipenv を現在使っている方
書かないこと
- 既存 Pipenv プロジェクトの uv 移行方法(筆者も試せていないため)
uv とは
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 にはこの機能はありません。pyenv や mise など、別ツールを利用して管理されているのではないでしょうか。
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_PROJECT
を true
に設定しておくとプロジェクトディレクトリに作成されます。
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 add
、uv 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.toml
の dependencies
内に記載されます。
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 ライフを!