pip3とuvは何が違う?Pythonのパッケージ管理を比較した

読了 約7分
pip3とuvは何が違う?Pythonのパッケージ管理を比較した

Pythonでライブラリを入れるとき、長いあいだ使ってきたのが pip3 でした。

ところが最近は、インストール手順に uv adduv run と書かれていることが増えています。見た目はpipの新しい高速版ですが、実際に触ってみると担当範囲がかなり違います。

先に結論を書くと、単発でパッケージを入れるだけならpipで十分、プロジェクトの環境をまとめて管理するならuvが便利です。

この記事では、pip3とuvの違いを、実際のコマンドを見ながら整理します。検索時によく使われる「pip3」をタイトルと見出しに残し、本文ではツールの総称として「pip」と表記します。コマンド例では、使用するPythonを明確にするため、基本的にpython3 -m pipを使います。

そもそもpip3とは

pipは、Pythonのパッケージをインストールするための標準的なツールです。requestsを入れるなら、次のように実行します。

pip3 install requests

pip3という名前は、Python 2向けのpipと区別するために使われてきました。ただし、複数のPythonが入っている環境では、pip3がどのPythonに結びついているのか分かりにくいことがあります。

そのため、pipの公式ドキュメントでは、Unix・macOSで次の書き方が案内されています。

python3 -m pip install requests

これなら「このpython3に対応するpipを使う」という関係が明確です。

pipが担当する中心的な仕事は、パッケージとその依存パッケージを解決して、指定したPython環境へインストールすることです。仮想環境の作成にはvenv、依存バージョンの固定にはpip-toolsなど、別の仕組みを組み合わせることがあります。

uvとは:pipより広い範囲を管理するツール

uvは、Astralが開発するRust製のPythonパッケージ・プロジェクト管理ツールです。

パッケージのインストールだけでなく、次の仕事をひとつのコマンドにまとめています。

  • Python本体のインストールとバージョン管理
  • 仮想環境の作成
  • パッケージの追加と削除
  • 依存関係の解決とロック
  • プロジェクト内でのコマンド実行
  • Python製CLIツールの一時実行・インストール

つまり、pipだけを置き換える道具というより、pipvenvpip-toolspipxpyenvなどが分担していた作業を広く引き受ける道具です。

新しいプロジェクトでは、プロジェクト作成からパッケージの追加、プログラムの実行までをuvのコマンドで進められます。具体的な手順は後ほどpipと並べて比較します。

pip3とuvの違いを表で比較

比較項目 pip uv
主な役割 パッケージのインストール Pythonとプロジェクト環境の総合管理
実装 Python Rust
速度 標準的 依存解決・インストールが高速
仮想環境 venvなどを別に使う uv venvまたはプロジェクト操作時に自動作成
依存関係の宣言 requirements.txtpyproject.toml 主にpyproject.toml
ロック pip単体では専用ロックファイルを作らない uv.lockを自動作成
Python本体の管理 しない できる
コマンド実行 仮想環境を有効化して実行 uv runで実行できる
導入 Python環境に同梱されることが多い uvを別途インストールする
互換性 長年使われ、対応例が多い 一般的なpip操作に対応するが完全互換ではない

一番大きな違いは速度よりも、管理する範囲です。

pipは小さく組み合わせる道具です。uvは、Pythonプロジェクトを始めてから実行するまでの流れを一つにまとめます。

同じ環境を作る手順を比べる

たとえば、仮想環境を作り、requestsを入れて、プログラムを実行するとします。

pip3とvenvを使う場合

mkdir sample-app
cd sample-app
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install requests
python3 -m pip freeze > requirements.txt
python3 main.py

Python標準の道具を中心にしているので、それぞれの処理が見えやすい構成です。一方で、仮想環境の作成や有効化、依存バージョンの書き出しは自分で行います。

uvを使う場合

uv init sample-app
cd sample-app
uv add requests
uv run python main.py

uvでは、pyproject.tomlに「このプロジェクトが必要とするパッケージ」、uv.lockに「実際に解決された正確なバージョン」が記録されます。

別のPCでリポジトリを取得したときは、次のコマンドでロックファイルに合わせた環境を作れます。

uv sync

uv.lockはGitに含めておきます。開発者ごとに微妙に違うバージョンが入る事故を減らせるのが、uvを使う大きな理由です。

uvのメリット

インストールと依存解決が速い

uvはRustで実装され、ダウンロードしたパッケージをグローバルキャッシュで再利用します。公式サイトは、キャッシュの状態や処理内容によってpipより10〜100倍高速と説明しています。

もちろん、これはあらゆる環境で常に100倍になるという意味ではありません。それでも、CIで毎回環境を作る場合や、依存パッケージが多いプロジェクトでは差を感じやすいところです。

環境を再現しやすい

pyproject.tomluv.lockの役割が分かれているため、「必要な条件」と「解決済みのバージョン」を両方残せます。

さらにuv.lockは、OS、CPUアーキテクチャ、Pythonバージョンなどの条件を含められるユニバーサルロックファイルです。macOSで作業する人とLinuxでCIを動かす場合でも、ひとつのロックファイルを共有できます。

仮想環境を意識する場面が減る

uv runは、実行前にプロジェクトのロックと同期を確認します。毎回source .venv/bin/activateを実行しなくても、プロジェクトの環境でコマンドを動かせます。

uv run pytest
uv run python main.py

環境を有効化し忘れて、別のPythonにパッケージを入れてしまう。あの地味な事故が減ります。

pip3を選ぶほうがよい場面

uvが便利でも、pipが不要になったわけではありません。

次のような場面では、pipのままで十分です。

  • 既存の手順がpipとrequirements.txtで安定している
  • Dockerイメージなどで、追加ツールをなるべく増やしたくない
  • ひとつのパッケージを試すだけで、プロジェクト管理までは必要ない
  • 社内の独自パッケージや特殊なpipオプションを使っている
  • Pythonの学習中で、仮想環境とパッケージ管理を一つずつ理解したい

uvのuv pipは一般的なpip操作を置き換えられますが、pipを内部で呼び出しているわけではなく、完全なクローンでもありません。--userなど未対応の機能や、依存関係の解決方法、ビルド時の挙動に違いがあります。

特殊な構成を移行するときは、公式のpip互換性ガイドを確認したほうが安全です。

既存のpip環境からuvへ移行する

いきなりプロジェクト全体をuv方式へ変えなくても、pip互換インターフェースから試せます。

uv venv
uv pip install -r requirements.txt

この段階では、今までのrequirements.txtをそのまま使えます。

慣れてきたらpyproject.tomluv.lockを使うプロジェクト管理へ移行します。

uv init
uv add requests
uv sync

macOSでHomebrewを使っている場合、uvは次のコマンドで導入できます。

brew install uv

公式のスタンドアロンインストーラーやWindows向けの方法も、uvのインストール手順にまとまっています。

まとめ:新しいプロジェクトならuvを試しやすい

pip3とuvは、似たコマンドを持っていますが、同じ範囲の道具ではありません。

pipは、Pythonパッケージをインストールするための実績ある基盤です。必要に応じてvenvや別のロックツールを組み合わせる、Unix的な分かりやすさがあります。

uvは、パッケージのインストールに加えて、Python本体、仮想環境、依存関係、ロックファイル、コマンド実行までまとめて管理します。速さも魅力ですが、環境を作り直しやすく、日々のコマンドが短くなることのほうが大きな利点だと感じます。

既存プロジェクトを無理に移行する必要はありません。ただ、新しくPythonプロジェクトを始めるなら、私はuvを選びます。環境構築という本題ではない作業を、かなり静かに引き受けてくれるからです。

参考リンク