uv on Ubuntu 応用 — Rustベース超高速Pythonパッケージ管理の全機能

開発環境

uvはAstral社がRust製で開発している、超高速なPythonパッケージ・プロジェクトマネージャーです。基本的なインストールや仮想環境の作り方は入門記事で扱いましたが、この記事では応用機能に絞って深掘りします。

結論から言うと、uvは「pip + pip-tools + pipx + pyenv + virtualenv」をまとめて1つに置き換えられます。本記事では実際に Ubuntu 24.04 LTS(Docker公式イメージ ubuntu:24.04)で uv 0.11.21 を動かし、uv lock / uv sync によるロックファイル管理から、uv pip compileuvx・Pythonバージョン管理・ワークスペース(モノレポ)まで一通り検証しました。返ってきた実際の出力と実測時間だけを載せています。

この記事のポイント

  • uv add / uv lock / uv sync でCI/CDに強いロックファイル管理ができる
  • uv pip compilepip-tools の完全な代替として使える
  • uvx でツールをインストールなしにワンショット実行できる
  • uv python install で複数バージョンを共存管理、.python-version でプロジェクト固定
  • ワークスペース設定でモノレポの依存を uv.lock 1ファイルに一元管理できる
  • 同一パッケージのインストールで uv は pip の約6.8〜9.1倍速(実測)

前提環境と uv のインストール

本記事は以下の環境で検証しています。ホストを汚さないよう、すべて Docker の公式 Ubuntu イメージ内で実行しました。

項目
OS Ubuntu 24.04.4 LTS(Docker公式イメージ ubuntu:24.04
uv バージョン 0.11.21
コンテナ内の既定Python CPython 3.12.3(/usr/bin/python3.12
検証日 2026-06-14

uvのインストールは公式スクリプト一発です。root権限もPythonの事前インストールも不要で、$HOME/.local/bin にバイナリが置かれるだけです。




ubuntu@linuxlab: ~
$ curl -LsSf https://astral.sh/uv/install.sh | sh
To add $HOME/.local/bin to your PATH, run one of:
source $HOME/.local/bin/env (sh, bash, zsh)
source $HOME/.local/bin/env.fish (fish)
$ source $HOME/.local/bin/env
$ cat /etc/os-release | grep PRETTY_NAME
PRETTY_NAME=”Ubuntu 24.04.4 LTS”
$ uv –version
uv 0.11.21 (aarch64-unknown-linux-gnu)
uvインストールとバージョン確認(Ubuntu 24.04 実測)
uvインストールとバージョン確認(Ubuntu 24.04 実測)
著者アイコン
著者アイコン

末尾の aarch64 は検証ホストのCPUがArm系だったためです。一般的なamd64のVPSでは x86_64-unknown-linux-gnu と表示されますが、コマンドや使い方は全く同じです。curl が無いコンテナでは先に apt-get install -y curl ca-certificates を実行してください。

uvがどんなツールかは、公式ドキュメント(docs.astral.sh/uv)のトップにも端的にまとまっています。「pip・pip-tools・pipx・poetry・pyenv・twine・virtualenv を1つで置き換える」「pipより10〜100倍速い」と明記されています。

uv公式ドキュメント トップページ(実撮影・10〜100倍速の記載)
uv公式ドキュメント トップページ(実撮影・10〜100倍速の記載)

uv add / uv lock / uv sync でロックファイル管理

uvの最大の特徴のひとつがロックファイル(uv.lock)による完全な再現性です。pipでは再現性のために pip freeze > requirements.txt を使いますが、uvはより厳密な uv.lock を自動で生成・管理します。

手順1:プロジェクトを初期化して依存を追加する




ubuntu@linuxlab: ~/myproject
$ uv init myproject && cd myproject
$ uv add requests httpx
Using CPython 3.12.3 interpreter at: /usr/bin/python3.12
Creating virtual environment at: .venv
Resolved 11 packages in 824ms
Prepared 10 packages in 724ms
Installed 10 packages in 87ms
+ httpx==0.28.1
+ requests==2.34.2
+ urllib3==2.7.0 (+ anyio 4.13.0, certifi 2026.5.20, h11 0.16.0 …)

uv add を1回実行するだけで、pyproject.toml への依存追記・uv.lock の生成・.venv へのインストールが一気に行われます。今回は requests・httpx の2つを指定して、依存を含む計11パッケージが 824ミリ秒で解決されました。

手順2:ロックの整合性チェックと環境再現




ubuntu@linuxlab: ~/myproject
$ uv lock –check
Resolved 11 packages in 1ms
$ uv sync
Resolved 11 packages in 5ms
Checked 10 packages in 0.48ms
$ uv run python -c “import requests,httpx; print(requests.__version__, httpx.__version__)”
2.34.2 0.28.1
$ wc -l uv.lock
192 uv.lock
uv add/lock/sync の実行結果(Ubuntu 24.04 実測)
uv add/lock/sync の実行結果(Ubuntu 24.04 実測)

uv lock --check は CI で「uv.lockpyproject.toml と矛盾していないか」を検証するコマンドで、今回は 1ミリ秒で完了しました。uv sync は別マシンや本番環境で uv.lock 通りの環境を再現するコマンドで、すでに同期済みなら「Checked 10 packages in 0.48ms」とほぼ瞬時に終わります。生成された uv.lock は192行で、全パッケージのバージョン・ハッシュが記録されています。

注意

uv.lockgit管理に必ず含めてください。このファイルをリポジトリにコミットすることで、チームメンバー全員・CI環境で全く同じパッケージバージョンが再現されます。.gitignore に追加してはいけません。

uv pip compile で requirements.txt を生成する

既存プロジェクトで pip-tools を使っている場合、uv pip compile はほぼそのまま置き換えられます。requirements.in に大雑把な依存を書くと、完全にピン留めされた requirements.txt を出力します。




ubuntu@linuxlab: ~
$ cat requirements.in
requests>=2.28
httpx
fastapi
$ uv pip compile requirements.in -o requirements.txt
Resolved 17 packages in 992ms
fastapi==0.136.3
# via -r requirements.in
pydantic==2.13.4
# via fastapi
starlette==1.3.1 httpx==0.28.1 requests==2.34.2 …
$ wc -l requirements.txt
52 requirements.txt
uv pip compile の実行結果(Ubuntu 24.04 実測)
uv pip compile の実行結果(Ubuntu 24.04 実測)

実際に計測してみると、3行(requests・httpx・fastapi)の依存を 17パッケージに展開して 992ミリ秒で完了しました(2026-06-14 実測)。fastapi の依存として pydantic 2.13.4・pydantic-core 2.46.4・starlette 1.3.1 などが自動で引き込まれています。生成された requirements.txt は52行で、各パッケージに # via コメントで依存元が明記されているのがpip-tools譲りの便利なところです。

uv run –with と PEP 723 インラインスクリプト

uv run --with を使うと、仮想環境を作らずに一時的な依存を注入してスクリプトを実行できます。ちょっと試したいだけのケースで便利です。




ubuntu@linuxlab: ~
$ uv run –with requests python -c “import requests; print(requests.__version__)”
Installed 5 packages in 46ms
2.34.2

さらに高度な使い方として、PEP 723「インラインスクリプトメタデータ」があります。スクリプトファイルの先頭に依存情報を書いておくと、uvが自動で環境を用意して実行してくれます。




ubuntu@linuxlab: ~
$ cat myscript.py
# /// script
# requires-python = “>=3.11”
# dependencies = [“httpx”, “rich”]
# ///
import httpx
print(“httpx”, httpx.__version__)
$ uv run myscript.py
Installed 11 packages in 77ms
httpx 0.28.1

スクリプトのヘッダーに依存を書くだけで、実行時にuvが必要なパッケージ(今回は計11個)を77ミリ秒で用意してから実行してくれました。配布するスクリプトを requirements.txt なしで自己完結させられるのが便利です。

uv tool install / uvx でツールをグローバル管理

CLIツールをPythonで管理したいとき、uv tool installuvxpipx の完全な代替として機能します。

手順1:uv tool install でグローバルインストールする




ubuntu@linuxlab: ~
$ uv tool install ruff
Resolved 1 package in 312ms
Downloading ruff (10.4MiB)
+ ruff==0.15.17
Installed 1 executable: ruff
$ ruff –version
ruff 0.15.17
$ uv tool list
ruff v0.15.17

手順2:uvx でワンショット実行する

インストールせずに一度だけ使いたいツールは uvx が便利です。




ubuntu@linuxlab: ~
$ uvx –from httpie http –version
Installed 16 packages in 237ms
3.2.4
uv tool install と uvx ワンショット実行(Ubuntu 24.04 実測)
uv tool install と uvx ワンショット実行(Ubuntu 24.04 実測)

実際に Ubuntu 24.04 コンテナで検証した結果、ruff 0.15.17 のグローバルインストールが完了し、uvx --from httpie で httpie 3.2.4 を16パッケージ・237ミリ秒で用意してワンショット実行できることを確認しました(2026-06-14 実測)。

uv python install で複数バージョンを管理する

pyenvを使わなくても、uvだけで複数のPythonバージョンを管理できます。uv python install で指定バージョンをダウンロードし、uv python pin でプロジェクトごとに固定します。




ubuntu@linuxlab: ~
$ uv python list | head -5
cpython-3.15.0b2-linux-aarch64-gnu <download available>
cpython-3.14.6-linux-aarch64-gnu <download available>
cpython-3.13.14-linux-aarch64-gnu <download available>
cpython-3.12.13-linux-aarch64-gnu <download available>
cpython-3.12.3-linux-aarch64-gnu /usr/bin/python3.12
$ uv python install 3.11
Downloading cpython-3.11.15-linux-aarch64-gnu (29.8MiB)
Installed Python 3.11.15 in 6.60s
$ uv init pintest && cd pintest && uv python pin 3.11
Pinned `.python-version` to `3.11`
$ cat .python-version
3.11
$ uv run python –version
Python 3.11.15
uv python install と python pin の実行結果(Ubuntu 24.04 実測)
uv python install と python pin の実行結果(Ubuntu 24.04 実測)

実際に検証したところ、uv python install 3.11 は 29.8MiB をダウンロードして Python 3.11.15 を 6.60秒でインストールしました。uv python pin 3.11.python-version ファイルに「3.11」が書き込まれ、そのディレクトリでは uv run が自動的に 3.11.15 を使うようになります(2026-06-14 実測)。このファイルをgit管理に含めれば、チーム全員が同じPythonバージョンで開発できます。

正直なところ、CPython 3.12〜3.15(ベータ)が一覧にずらりと並び、フリースレッド版(+freethreaded)まで選べるのは驚きでした。pyenvとの組み合わせを考えていた方は、uvだけで完結するかもしれません。

ワークスペース(モノレポ)で複数パッケージを一元管理

複数のPythonパッケージで構成するモノレポ(monorepo)は、uvのワークスペース機能で管理できます。ルートの pyproject.toml にメンバーを定義するだけで、全パッケージの依存が1つの uv.lock に集約されます。




ubuntu@linuxlab: ~/monorepo
$ cat pyproject.toml
[tool.uv.workspace]
members = [“packages/*”, “apps/*”]
$ uv add requests –package lib-a
Resolved 8 packages in 358ms
Building lib-a @ file:///tmp/monorepo/packages/lib-a
+ lib-a==0.1.0 (from file:///tmp/monorepo/packages/lib-a)
+ requests==2.34.2
$ uv sync –all-packages
+ lib-b==0.1.0 (from file:///tmp/monorepo/packages/lib-b)
$ wc -l uv.lock
146 uv.lock
uvワークスペースのモノレポ構築(Ubuntu 24.04 実測)
uvワークスペースのモノレポ構築(Ubuntu 24.04 実測)

実際に packages/lib-apackages/lib-bapps/server の3パッケージ構成のモノレポを構築しました。uv add requests --package lib-a のように --package フラグで特定パッケージだけに依存を追加でき、uv sync --all-packages でワークスペース全体を一括同期できます。結果として全体の依存が 146行の単一 uv.lock に集約されました(2026-06-14 実測)。

キャッシュ管理と便利な環境変数

uvのキャッシュはデフォルトで ~/.cache/uv(Linux)に保存されます。環境変数 UV_CACHE_DIR で変更できます。




ubuntu@linuxlab: ~
$ uv cache dir
/root/.cache/uv
$ ls $(uv cache dir)
CACHEDIR.TAG interpreter-v4 sdists-v9 …
# 環境変数でキャッシュパスを変更
$ export UV_CACHE_DIR=/tmp/my-uv-cache
$ uv cache dir
/tmp/my-uv-cache
$ uv pip install httpx -q && du -sh $UV_CACHE_DIR
2.9M /tmp/my-uv-cache

主要な環境変数は以下の通りです。CI環境ではこのキャッシュディレクトリをボリュームとして保存しておくと、2回目以降のインストールが劇的に速くなります(後述のベンチ参照)。

環境変数 説明 デフォルト
UV_CACHE_DIR キャッシュ保存先 ~/.cache/uv(Linux)
UV_PYTHON 使用するPythonバージョン システム or .python-version
UV_INDEX_URL PyPI以外のインデックス https://pypi.org/simple
UV_COMPILE_BYTECODE インストール時にバイトコード生成 無効
UV_NO_SYNC uv run 時にsyncをスキップ 無効

pip vs uv インストール速度の実測比較

「uvは速い」とよく言われますが、実際どのくらい速いのか。fastapi・uvicorn・requests の3パッケージ(依存含む)を、まっさらな ubuntu:24.04 コンテナの空の仮想環境にインストールし、date +%s.%N で実測しました。

pip vs uv インストール速度の実測比較(Ubuntu 24.04 実測)
pip vs uv インストール速度の実測比較(Ubuntu 24.04 実測)

計測結果(2026-06-14 実測):

  • コールド(初回・キャッシュなし):pip 6.56秒 に対し uv 0.97秒約6.8倍速
  • ウォーム(キャッシュあり):pip 1.09秒 に対し uv 0.12秒約9.1倍速

キャッシュが効いた2回目では、uvは0.12秒とほぼ一瞬で終わります。コールドでもウォームでもuvが圧倒的に速く、特にCI/CDのように何度もインストールを繰り返す場面では、この差がそのままパイプライン全体の短縮につながります。公式が「pipより10〜100倍速い」とうたう根拠が、手元でもはっきり確認できました。

よくあるエラーと解決策

「uv: command not found」

インストール直後はPATHが通っていないことがあります。$HOME/.local/bin を通せば解決します。




ubuntu@linuxlab: ~
# インストール直後にPATHを通す
$ source $HOME/.local/bin/env
# 永続化するには .bashrc に追加
$ echo ‘export PATH=”$HOME/.local/bin:$PATH”‘ >> ~/.bashrc
$ source ~/.bashrc && uv –version
uv 0.11.21 (aarch64-unknown-linux-gnu)

「This environment is externally managed」エラー(pip使用時)

Ubuntu 24.04 では pip install を直接実行すると PEP 668 のエラーが出ます。uvを使うとこのエラーは一切発生しません。uvは最初から仮想環境を前提に設計されているため、システムのPythonを壊す心配がないからです。

注意

Ubuntu 24.04 LTS の Python 環境は「外部管理環境」として保護されています。sudo pip install でシステムパッケージを上書きしないよう、uvの仮想環境機能(uv venv / uv add)を活用してください。

uvx と uv tool の使い分けがわからない

頻繁に使うツール(ruff・black など)は uv tool install でグローバル導入し、たまにしか使わないツールは uvx でワンショット実行する、という使い分けがおすすめです。uvの公式ドキュメントには各機能の解説ページが整理されているので、迷ったら一次情報を確認しましょう。

uv公式ドキュメント Features ページ(実撮影)
uv公式ドキュメント Features ページ(実撮影)
uv GitHubリポジトリ(実撮影・0.11.21 が最新リリース)
uv GitHubリポジトリ(実撮影・0.11.21 が最新リリース)

まとめ

uv の応用機能を Ubuntu 24.04.4 LTS(ubuntu:24.04 コンテナ)で一通り実測検証しました。

  • uv add / uv lock / uv sync:11パッケージを824msで解決、uv.lock 192行で完全な再現性
  • uv pip compile:pip-tools の代替。3行の入力を17パッケージ・992msで解決し52行に展開
  • uv run --with / PEP 723:仮想環境不要のスクリプト実行(77msで環境構築)
  • uvx:インストールなしでツールをワンショット実行(httpie 3.2.4 を237msで用意)
  • uv python install:Python 3.11.15 を6.60sで導入、pyenv不要でバージョン管理が完結
  • ワークスペース:3パッケージのモノレポ依存を146行の単一 uv.lock で管理
  • 速度:同一パッケージ群のインストールで pip の約6.8〜9.1倍速(実測)

正直なところ「uvは速い」というイメージはありましたが、Pythonバージョン管理からモノレポ対応まで、これ1ツールでここまでカバーできるとは思っていませんでした。既存の pyenv + pip + pip-tools + pipx の組み合わせをuvに一本化することを強くお勧めします。なお、uvの基本的なインストールと仮想環境の作り方は入門記事で詳しく解説しています。

実際にVPS上でPython開発環境を構築したい方は、まずサーバーを立てる必要があります。開発環境として使いやすく、東京リージョンが選べるVPSなら以下が定番です。

コメント

タイトルとURLをコピーしました