← Posts

uv チートシート

uv1 は Rust で書かれた Python のパッケージ管理ツールである。 pippip-toolsvirtualenvpyenvpipxpoetry が別々に担っていた役割を一つのコマンドにまとめ、依存解決とインストールを高速に行う。

この記事は、公式ドキュメント2を読みながら、日常的に使うコマンドを用途別にまとめた早見表である。 大きく分けて、pyproject.toml を軸にしたプロジェクト管理、単体スクリプトの実行、CLI ツールの実行と常駐、Python 本体のバージョン管理、そして pip 互換の低レベルインターフェースがある。

インストールと自己管理

Terminal window
curl -LsSf https://astral.sh/uv/install.sh | sh
コマンド用途
uv self updateuv 自身を最新版に更新する
uv versionuv のバージョンを表示する
uv --helpヘルプを表示する(各サブコマンドにも --help がある)

プロジェクト管理

pyproject.toml で依存を宣言し、uv.lock で解決結果を固定し、.venv に環境を作る。 このワークフローがプロジェクト管理の中心になる。

コマンド用途
uv init myappmyapp/ に新規プロジェクトを作る
uv initカレントディレクトリを初期化する
uv init --libライブラリ用の構成で初期化する
uv add requests依存を追加し、pyproject.tomluv.lock.venv を更新する
uv add 'requests==2.31.0'バージョンを指定して追加する
uv add --dev pytest開発用依存グループに追加する
uv add -r requirements.txt既存の requirements から一括で追加する
uv add 'git+https://github.com/psf/requests'Git リポジトリから追加する
uv remove requests依存を削除する
uv syncuv.lock に合わせて .venv を同期する
uv lockロックファイルを作成・更新する
uv lock --upgrade-package requests特定パッケージだけ更新する
uv run main.pyプロジェクト環境でスクリプトを実行する
uv run -- flask run -p 3000プロジェクト環境で任意のコマンドを実行する
uv tree依存関係ツリーを表示する
uv build配布物(sdist / wheel)を dist/ に生成する
uv publishパッケージインデックスに公開する

uv run を使えば .venv を明示的に有効化する必要はないが、有効化して従来通り使うこともできる。

Terminal window
source .venv/bin/activate

プロジェクト直下には次のファイルが置かれる。

ファイル役割
pyproject.tomlプロジェクトのメタデータと依存の宣言
uv.lock解決結果を固定するクロスプラットフォームなロックファイル(uv が管理する)
.python-version既定の Python バージョン
.venv/仮想環境

スクリプト実行

単体のスクリプトは、プロジェクトを作らずに実行できる。 依存はコマンドで一時的に足すか、PEP 7233 のインラインメタデータとしてスクリプト先頭に埋め込む。

コマンド用途
uv run example.pyスクリプトを実行する
uv run --with requests example.py依存を一時的に足して実行する
uv run --with 'requests<3' --with rich example.py--with を重ねて複数の依存を足す
uv run --python 3.12 example.pyPython 3.12 で実行する
uv run --no-project example.pyプロジェクト内でもプロジェクト依存を無視する
uv add --script example.py 'requests<3' richスクリプトにインライン依存を書き込む
uv lock --script example.pyスクリプト用のロックファイルを作る
echo 'print("hi")' | uv run -標準入力から実行する

uv add --script は、スクリプト先頭に依存を書いたコメントブロック(PEP 723 のインラインメタデータ)を追記する。 依存の情報がスクリプト自身に入るので、requirements.txtpyproject.toml を別に用意しなくても、そのファイル一つで依存関係が完結する。 受け取った側は uv run example.py を実行するだけでよく、uv がこのメタデータを読んで依存を用意する。 このため、環境構築の説明なしに人へ渡したいちょっとした自動化スクリプトや、Gist のような単一ファイルの共有が主な用途になる。

書き込まれるメタデータは次の形になる。

example.py
# /// script
# requires-python = ">=3.12"
# dependencies = [
# "requests<3",
# "rich",
# ]
# ///

シェバングに指定すれば、スクリプトを直接実行できる。

example.py
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = ["httpx"]
# ///
import httpx
Terminal window
chmod +x example.py && ./example.py

ツールの実行とインストール

ruffblack のような CLI ツールは、一時環境で実行するか、ユーザー全体にインストールして常駐させる。 uvx は一時環境での実行、uv tool install は PATH に実行ファイルを通す常駐インストールである。

コマンド用途
uvx ruff check一時環境でツールを実行する(uv tool run の別名)
uvx [email protected] checkバージョンを指定して実行する
uvx --from httpie http example.comパッケージ名とコマンド名が違うとき --from で指定する
uv tool install ruffツールをユーザー全体にインストールし、PATH に通す
uv tool install 'httpie>0.1.0'バージョン制約つきでインストールする
uv tool install mkdocs --with mkdocs-materialプラグインを同梱してインストールする
uv tool upgrade ruffインストール済みツールを更新する
uv tool upgrade --allすべてのツールを更新する
uv tool uninstall ruffツールをアンインストールする
uv tool listインストール済みツールを一覧する
uv tool update-shellPATH を通すためシェル設定を更新する

uv は、import せずにシェルからコマンドとして起動するパッケージをツールと呼び、専用のコマンド群を用意している。 ruffmypyblack のように、コードを外から検査・整形するもので、アプリの一部としては動かない。 そのためプロジェクトの依存(uv add)とは分け、プロジェクトから隔離した環境に入れる。 判断の目安は、コード中で import するなら uv add、コマンド名を打って使うだけなら uv tool である。

インストールしたツールの環境は、直接いじらず uv tool upgradeuv tool install 経由で更新する。 uv はツール環境を直接手を加える前提で作っていないため、中の .venv に手動で pip install などをすると壊れることがある。

Python バージョンの管理

uv は Python 本体のインストールとバージョン切り替えも担う。 pyenv に相当する役割であり、uv を使うなら pyenv は不要になる。

コマンド用途
uv python install 3.12Python 3.12 をインストールする
uv python install 3.11 3.12複数バージョンをまとめてインストールする
uv python install [email protected]別実装(PyPy)をインストールする
uv python install最新版をインストールする
uv python list利用可能・インストール済みのバージョンを一覧する
uv python pin 3.12.python-version に書き込み、プロジェクトに固定する
uv python pin --global 3.11ユーザー全体の既定を固定する
uv python find '>=3.11'条件に合う Python を探す
uv python upgrade 3.12管理下の 3.12 を更新する
uv python uninstall 3.11バージョンをアンインストールする

pip 互換インターフェース

uv pip は、既存の pip / pip-tools ワークフローをそのまま高速化するための低レベルコマンド群である4。 プロジェクトの uv add / uv sync とは別系統で、requirements.txt を手で扱う場面や移行期に使う。

仮想環境

コマンド用途
uv venv.venv を作る
uv venv --python 3.12Python 3.12 で作る
uv venv myenv名前を指定して作る

パッケージ操作

コマンド用途
uv pip install flaskパッケージをインストールする
uv pip install 'flask[dotenv]'extra つきでインストールする
uv pip install 'ruff>=0.2.0'バージョン制約つきでインストールする
uv pip install -e .カレントを editable でインストールする
uv pip install -r requirements.txtrequirements から一括インストールする
uv pip install -r pyproject.toml --all-extraspyproject.toml の全 extra を入れる
uv pip install 'git+https://github.com/astral-sh/ruff'Git からインストールする
uv pip uninstall flaskアンインストールする

環境の確認

コマンド用途
uv pip listインストール済みパッケージを一覧する
uv pip freezerequirements 形式で出力する
uv pip show flaskパッケージの詳細を表示する
uv pip tree依存ツリーを表示する
uv pip check依存の整合性を確認する

ロックと同期(pip-tools 相当)

コマンド用途
uv pip compile requirements.in -o requirements.txt.in から固定された .txt を生成する
uv pip compile pyproject.toml -o requirements.txtpyproject.toml から生成する
uv pip compile requirements.in -o requirements.txt --upgradeすべて更新して再生成する
uv pip compile requirements.in -o requirements.txt --upgrade-package ruff特定パッケージだけ更新する
uv pip compile requirements.in -o requirements.txt --universalプラットフォーム非依存で解決する
uv pip sync requirements.txt環境を requirements.txt に厳密に一致させる

uv pip install は既存のパッケージを残すが、uv pip sync はロックにないものを削除して環境を完全一致させる。

pip-tools 風のワークフローはこうなる。

Terminal window
uv pip compile requirements.in -o requirements.txt # 依存を固定する
uv pip sync requirements.txt # 環境を一致させる

既存プロジェクトの移行

uv pip の主な使いどころは、すでに pip と requirements.txt で動いているプロジェクトの移行である。 uv add / uv sync のマネージド構成へは、二段階で無理なく移せる。

段階1では、既存のコマンドを uv pip に置き換えるだけにとどめる。 requirements.txt の構成はそのままで、既存の pip コマンドを uv pip に差し替えるだけでよい。 uv は pip の drop-in replacement であり、10〜100 倍の高速化が見込める5

Terminal window
uv venv # python -m venv .venv の置き換え
uv pip install -r requirements.txt # pip install -r ... の置き換え

段階2では、余裕ができてから pyproject.tomluv.lock のマネージド構成へ引き上げる。 uv add -r が既存の requirements.txt を読み、依存を pyproject.toml に取り込み、uv.lock を生成する。

Terminal window
uv init --bare # 既存ディレクトリに pyproject.toml だけ作る
uv add -r requirements.txt # requirements.txt の中身を依存として取り込む

ここまで来れば、以降は uv add / uv sync / uv run に切り替えられ、requirements.txt は不要になる。

キャッシュとディレクトリ

コマンド用途
uv cache cleanキャッシュを削除する
uv cache prune古いキャッシュ項目を削除する
uv cache dirキャッシュディレクトリのパスを表示する
uv tool dirツールの格納先を表示する
uv python dirPython の格納先を表示する

使い分けの目安

やりたいこと使うコマンド
アプリやライブラリを開発するuv inituv adduv run
依存を一度だけ足してスクリプトを試すuv run --with
CLI ツールを常駐させるuv tool install
CLI ツールを一度だけ使うuvx
Python 本体を入れて切り替えるuv python install / uv python pin
既存の pip / requirements 運用を速くするuv pip compile / uv pip sync

Footnotes

  1. uv 公式サイト。https://docs.astral.sh/uv/

  2. 本記事のコマンドは公式ドキュメントの各ガイド(Projects、Scripts、Tools、Installing Python、The pip interface)に基づく。

  3. PEP 723 は、スクリプトの依存や必要な Python バージョンを、ファイル先頭のコメントブロックに記述する仕様。

  4. uv pip は名前に反して pip を呼び出さない。pip と同じインターフェースを提供することを示すための名称である。

  5. uv は pip / pip-tools / virtualenv の drop-in replacement を掲げ、pip 比 10〜100 倍の高速化をうたう。https://docs.astral.sh/uv/