■uvとは?
uv は、Pythonの高速linterである Ruff を開発したAstral社が作った、Rust製のPythonパッケージマネージャーです。
一言でいうと、pip・venv・pip-tools・pyenv をまとめて1本に置き換えるツールです。
■pipの何が辛かったか
従来のPython環境構築は、複数のツールを組み合わせる必要がありました。
# 従来の典型的なワークフロー
python -m venv .venv # 仮想環境の作成
source .venv/bin/activate # 有効化(毎回必要)
pip install requests # パッケージインストール
pip freeze > requirements.txt # 依存関係の記録(バージョンが完全固定されない)
主な問題点:
-
venv→pip→pip-tools→pyenvと、ツールが分散していて管理が煩雑 -
pip installが遅い(特にCIや大規模プロジェクト) -
pip uninstallしても推移的依存関係が残り、環境が汚れる -
requirements.txtだけでは再現性が不完全 - Pythonのバージョン管理には別途 pyenv が必要
■uvのメリット
1. 圧倒的な速さ
Rust製かつ並列ダウンロード+効率的なグローバルキャッシュにより、インストール速度が向上します。
2. ツールが1本に集約
| 役割 | 従来のツール | uv |
|---|---|---|
| パッケージインストール | pip | uv add |
| 仮想環境 | venv / virtualenv | uv venv |
| 依存関係ロック | pip-tools / Poetry |
uv.lock(自動生成) |
| Pythonバージョン管理 | pyenv | uv python install |
3. グローバルキャッシュでディスク節約
venvでは各プロジェクトが依存関係を丸ごとコピーしますが、uvはグローバルキャッシュを使うため、同じパッケージは一度だけダウンロードされます。
プロジェクトが増えるほど恩恵が大きいです。
4. uv.lock で完全な再現性
uv.lock に全パッケージの正確なバージョンが記録されるため、ローカル・本番・CI環境で完全に同じ状態を再現できます。
pip freeze より信頼性が高いです。
5. アンインストールがきれい
uv remove は、指定パッケージの推移的依存関係も一緒に削除します。
pipでは孤立したパッケージが残り続けるという問題がありました。
■基本的な使い方
◆プロジェクト初期化
uv init my-project
cd my-project
以下のファイルが自動生成されます。
├── .python-version
├── main.py
├── pyproject.toml # プロジェクト設定
└── README.md
◆Pythonバージョン管理(pyenv不要)
# インストール可能なバージョン一覧
uv python list
# 特定バージョンをインストール
uv python install 3.12
# プロジェクトのPythonを指定
uv venv --python 3.12
◆パッケージ管理
# パッケージ追加(pyproject.toml + uv.lock に自動記録)
uv add requests fastapi
# 開発用依存の追加
uv add --dev pytest ruff
# パッケージ削除(推移的依存も一緒に削除)
uv remove requests
# 環境をロックファイルに同期
uv sync
パッケージをインストールすると、「pyproject.toml」や「uv.lock」に書き込まれていることがわかります。
package-lock.jsonのように固定できるのがいいです。
◆スクリプト実行(activate不要)
# venv の activate なしで実行できる
uv run python main.py
uv run pytest
uv run ruff check .
仮想環境を起動しないでも、各種ライブラリのコマンドを実行できます。
◆pipとの比較コマンド
| やりたいこと | pip | uv |
|---|---|---|
| パッケージ追加 | pip install requests |
uv add requests |
| パッケージ削除 | pip uninstall requests |
uv remove requests |
| 一覧表示 | pip list |
uv pip list |
| requirements.txtから | pip install -r requirements.txt |
uv pip install -r requirements.txt |
| 環境同期 | (pip-toolsが必要) | uv sync |
| スクリプト実行 | source .venv/bin/activate && python |
uv run python |
■知っておくと便利な機能
uvx:ツールをインストールせず一発実行(pipx代替)
uvx(uv tool run のエイリアス)を使うと、ツールを一時的な隔離環境でインストールして実行できます。
グローバル環境を汚さずに使い捨て実行できるのが便利です。
# ruff をインストールせず即実行
uvx ruff check .
# black でフォーマット(インストール不要)
uvx black main.py
# インストール済みツールを一括アップグレード
uv tool upgrade --all
Pythonバージョンの固定
プロジェクトに特定の Python バージョンを固定することができ、uv を使う全員が同じ Python バージョンを使えるようになります。
# プロジェクトのPythonを3.12.9に固定
uv python pin 3.12.9
# .python-version ファイルが生成される(Gitにコミットする)
cat .python-version
# 3.12.9
バージョン制約の指定
# バージョンを指定して追加
uv add "requests>=2.28,<3.0"
uv add "django==4.2.*"
# 既存パッケージのバージョン制約を更新
uv add "requests>=2.32"
# 最新バージョンに一括アップグレード
uv lock --upgrade
uv sync
既存プロジェクトからの移行
既存の requirements.txt はそのまま使えます。
# requirements.txt がある既存プロジェクトへの適用
uv pip install -r requirements.txt
# 新しいuvプロジェクトとして移行する場合
uv init
uv add $(cat requirements.txt) # または手動でuv addしていく
■まとめ
uvはフロントエンドのnpmに近い体験をPythonにもたらしてくれるツールです。
- 速い、きれい、ツールが1本にまとまる
- 既存のpipワークフローとの互換性も高く、移行コストが低い
-
uv.lockによる再現性はチーム開発・CI環境で特に効果
