uv で Python 環境構築を爆速にする

Rust 製の Python パッケージマネージャー uv で、Python のインストール、仮想環境、依存の追加とロック、スクリプトとツールの実行を 1 つのコマンド体系にまとめる方法。requirements.txt からの移行、pip / poetry との比較表つき。

· 1,049 字 · 5 分
目次 9 sections
  1. 01 はじめに
  2. 02 インストール
  3. 03 Python 自体のインストール
  4. 04 プロジェクトの初期化
  5. 05 パッケージのインストール
  6. pip からの移行
  7. 06 スクリプトの実行
  8. インラインスクリプト
  9. 07 ツールの実行
  10. 08 pip / poetry との比較
  11. 09 まとめ

はじめに#

Python の環境構築は長年の課題です。pip でパッケージを入れ、venv で仮想環境を作り、requirements.txt でバージョンを固定し、場合によっては pyenv で Python 自体のバージョンも管理する。ツールが多すぎて、環境構築だけで疲弊することが珍しくありません。

uv は Astral 社(Ruff の開発元)が提供する Rust 製の Python パッケージマネージャーです。pip の 10〜100 倍速いインストール速度と、Python バージョン管理・仮想環境・パッケージ管理の一元化が特徴です。

インストール#

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

Windows なら PowerShell で以下を実行します。

Terminal window
$ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

インストール後、uv コマンドが使えることを確認します。

Terminal window
$ uv --version
uv x.y.z

Python 自体のインストール#

uv は Python のバージョン管理も担います。pyenv が不要になります。

Terminal window
$ uv python install 3.12
$ uv python list

uv python install はビルド済みバイナリをダウンロードするため、pyenv のようなソースからのコンパイルが不要です。数秒で終わります。

プロジェクトの初期化#

Terminal window
$ uv init my-project
$ cd my-project

uv init は以下のファイルを生成します。

my-project/
├── .git/
├── .gitignore
├── .python-version
├── README.md
├── main.py
└── pyproject.toml

uv init は内部で git init も実行するため、.git/ と .gitignore も同時に生成されます。

pyproject.toml がプロジェクトの中心です。依存パッケージ、Python バージョン制約、プロジェクトメタデータをすべてここに書きます。

パッケージのインストール#

Terminal window
$ uv add requests
$ uv add ruff --dev

uv add はパッケージを pyproject.toml に追加し、uv.lock にバージョンをロックし、仮想環境にインストールするところまでを 1 コマンドで行います。仮想環境が存在しなければ自動的に作成されます。

速度の違いは体感で明らかです。pip で 30 秒かかるインストールが、uv では 1〜2 秒で終わることも珍しくありません。Rust 製の依存解決エンジンと、パッケージのグローバルキャッシュが速さの理由です。

pip からの移行#

既存の requirements.txt からの移行も簡単です。

Terminal window
$ uv add -r requirements.txt

これだけで requirements.txt に書かれた全パッケージが pyproject.toml に移行され、uv.lock が生成されます。

スクリプトの実行#

Terminal window
$ uv run python main.py
$ uv run ruff check .

uv run は仮想環境をアクティベートせずにコマンドを実行します。source .venv/bin/activate を忘れて「パッケージが見つからない」と悩む問題がなくなります。

インラインスクリプト#

ファイル先頭にメタデータを書くことで、依存パッケージ付きのスクリプトを単体実行できます。

# /// script
# requires-python = ">=3.12"
# dependencies = ["requests", "rich"]
# ///
import requests
from rich import print
resp = requests.get("https://httpbin.org/get")
print(resp.json())
Terminal window
$ uv run fetch.py

uv run がメタデータを読み取り、依存パッケージを自動でインストールしてから実行します。使い捨てスクリプトの共有に便利です。

ツールの実行#

グローバルにインストールせずに CLI ツールを実行する uvx コマンドもあります。npx の Python 版です。

Terminal window
$ uvx ruff check .
$ uvx black --check .
$ uvx mypy src/

ツールは一時的な隔離環境にインストールされ、プロジェクトの依存を汚しません。

pip / poetry との比較#

操作pip + venvpoetryuv
仮想環境の作成python -m venv .venv自動自動
パッケージ追加pip install → 手動で requirements.txt 更新poetry adduv add
ロックファイルなし(pip-tools で別途生成)poetry.lockuv.lock
Python バージョン管理pyenv 等が別途必要pyenv 等が別途必要uv python install
インストール速度遅い遅い10〜100 倍速い
ツール実行(隔離環境)pipx(別途インストール)pipx(別途インストール)uvx

uv の最大の強みは これまで 3〜4 個のツールで賄っていた機能が 1 つに統合されている 点です。pyenv + venv + pip + pip-tools の組み合わせを uv 単体で置き換えられます。

まとめ#

  • uv は Python のバージョン管理・仮想環境・パッケージ管理を 1 コマンドに統合する
  • Rust 製の依存解決エンジンにより、pip の 10〜100 倍速いインストールを実現
  • uv run で仮想環境のアクティベートが不要、uvx でグローバルインストールなしのツール実行が可能
  • 既存の requirements.txt からの移行は uv add -r requirements.txt だけ

新規プロジェクトなら最初から uv を使うのがおすすめです。既存プロジェクトは、uv add -r requirements.txt で移行するところから始められます。速度の違いだけでも導入する価値があります。

記事一覧