最終更新:

uvとpipの違いは?uv add・uv pip installの使い分けと移行手順


pipとuv:何を管理する? pipuvパッケージを導入requirements.txt環境はvenvなどで分ける依存の登録 → 同期pyproject.tomluv.lock + 環境Pythonの導入も扱うuv pip install はロックを更新しない pipとuv:何を管理する? pipuvパッケージ導入requirements.txtvenvなどで環境を分ける依存を登録pyproject.tomlロック → 同期uv.lock + 環境uv pip install はロックを更新しない
環境に入れる操作と、依存を登録してロックに同期する操作を区別します。uvのpip互換コマンドとプロジェクト管理は別の使い方です。
ひよこ ひよこ
pipからuvに変えた方がいいの?
ペンギン先生 ペンギン先生
パッケージを入れるだけならpipで十分な場合もあるよ。Python本体・仮想環境・プロジェクトの依存関係をまとめて管理したいならuvが候補になる。速さだけでなく、どの作業を整理したいかで選ぼう。
ひよこ ひよこ
そもそも同じ種類のツールなの?
ペンギン先生 ペンギン先生
pipはPythonパッケージのインストーラー。uvはそれに加え、Pythonの導入や仮想環境、依存関係の記録・同期まで扱えるツールだよ。pipを使う場合も、標準のvenvなどと組み合わせて環境を分けられるんだ。
ひよこ ひよこ
uv addとuv pip installは同じ?
ペンギン先生 ペンギン先生
違うよ。uv add requestsはプロジェクトに依存を登録し、通常はpyproject.toml・uv.lock・環境を更新する。uv pip install requestsは対象環境に入れる操作で、プロジェクトの依存宣言やuv.lockを更新するものではないんだ。
ひよこ ひよこ
今あるrequirements.txtは捨てるの?
ペンギン先生 ペンギン先生
捨てなくていいよ。まずuv venvで仮想環境を作り、uv pip install -r requirements.txtを試せる。uvのプロジェクト管理へ移るならuv add -r requirements.txtという別の段階になる。移行前後でテストを通そう。
ひよこ ひよこ
uvなら必ず何十倍も速いの?
ペンギン先生 ペンギン先生
保証はできないよ。ネットワーク、キャッシュ、依存の数、ソースからのビルドが必要かで時間は変わる。初回の導入とキャッシュがある再実行を分け、同じ依存とPythonで比べよう。この記事では独自の速度測定はしていないよ。
ひよこ ひよこ
uv.lockを保存すれば何もしなくていい?
ペンギン先生 ペンギン先生
依存の解決結果を共有できるけれど、PythonやOSなどの条件も大事だよ。uv runは通常、実行前にロックと環境を更新する。CIではuv sync --lockedなどで、依存宣言とロックの食い違いを見つけるといいね。
ひよこ ひよこ
pipの設定は全部そのまま使える?
ペンギン先生 ペンギン先生
完全な置き換えではないよ。uvはpip.confやPIP_INDEX_URLをそのまま読むわけではなく、パッケージ配布元が複数ある場合の選び方にも差がある。社内の配布元や認証を使うチームほど、設定の移し替えを確認しよう。
ひよこ ひよこ
どこから導入するのがよさそう?
ペンギン先生 ペンギン先生
まず検証用の環境で1つのプロジェクトを試そう。依存追加、テスト、CI、本番への配布まで確認できたら広げる。pipで困っていないなら無理に変えず、uvを導入する場合もチームで依存を更新するコマンドをそろえるのが大切だよ。

目的別にコマンドを選ぶ

やりたいことpip中心の運用uvの運用
仮想環境を作るpython -m venv .venvuv venv
環境にパッケージを入れるpython -m pip install requestsuv pip install requests
プロジェクトの依存を追加する依存宣言の管理方法を別途決めるuv add requests
記録した依存に環境を合わせる固定したrequirementsなどから導入uv sync
プロジェクト内で実行する対象環境のPythonを使うuv run python main.py

pip側のコマンドは、対象の仮想環境を有効にした状態を想定しています。uvのプロジェクトコマンドはpyproject.tomlのあるプロジェクト内で使います。

uv addとuv pip installを混同しないことが大切です。 uvでプロジェクト管理をしているのにuv pip installだけで追加すると、依存宣言に残りません。後のuv syncで、既定では、ロックにないパッケージが削除されます。

requirements.txtから段階的に移す

uvを公式のインストール手順で導入済みとして、既存プロジェクトの検証用コピーで試します。既存の.venvを上書きしないよう、空の作業環境を使ってください。

uv venv
uv pip install -r requirements.txt
uv pip check

これはインストール手段を変更する例です。uv pip checkは依存の整合性を確認しますが、アプリの動作テストの代わりにはなりません。

プロジェクト管理も移す場合は、既存のpyproject.tomlを確認し、なければuv initで作成したうえで次を使います。

uv add -r requirements.txt
uv sync --locked

pip freeze由来のファイルには間接依存も含まれます。そのまま取り込むと全件が直接依存として登録されるため、アプリが実際に使うパッケージと開発用ツールを整理してください。Poetryなどの独自設定は、自動で同じ意味に移るとは限りません。

CIで再現性を確かめる

pyproject.tomlとuv.lockをGitで共有し、CIで使うPython・uvの版もそろえます。--lockedはロックの更新が必要ならエラーにします。一方、--frozenはロックの新しさの確認を省いて既存ロックを使うため、同じ意味ではありません。

速度を比較するなら、インストール工程だけでなくテストを含むCI全体も測りましょう。移行判断の基準は「何倍速いか」だけでなく、設定の保守性と既存パッケージの互換性です。

プロジェクトとCLIツールは別の置き場所にする

アプリが利用するrequestsはuv add requestsでプロジェクトに登録します。一方、複数のプロジェクトで使うコマンドを試したいなら、uvx ruff check .のようにツール用の隔離環境で実行する方法があります。uvxはuv tool runの別名で、プロジェクトの依存宣言を増やさずに使えます。チームで同じ版を使いたい開発ツールは、uv add --dev ruffで管理してuv run ruff check .を使う方法もあります。

なお、uv syncは既定でロックにないパッケージを削除しますが、uv runの既定の同期は余分なパッケージを残します。「コマンドが動いた」だけで環境が完全にロックと一致したとは判断せず、CIで何を同期するかを決めましょう。

選び方のまとめ

pipの既存運用に困っていなければ、そのままでも構いません。まず導入時間を短くしたいならuv pipを検証し、依存の追加・ロック・実行まで運用をそろえたいならuvのプロジェクト管理を試す、という順番が選びやすいです。

次に読む記事を、目的で選ぶ

  • Python自体を学び始めたいなら:Python入門 — コードを実行するところから学ぶ。
  • 入れたライブラリで分析を試したいなら:DuckDB入門 — CSVをSQLで集計する小さな例に進む。

参考資料

確認日:2026年10月4日。以下は仕様の根拠であり、本記事独自の性能比較ではありません。

次に学ぶなら