Python uv入門|pipとの違いと乗り換え手順

プログラミング

先月、Lambda用のデプロイパッケージを作り直していたときに、pip install -r requirements.txt が終わるのをぼーっと待っている自分に気づきました。待ち時間そのものはたぶん40秒くらいなんですが、CIで何度も回すと地味に効いてくるやつです。前から名前だけ知っていた uv に、そろそろちゃんと乗り換えてみるかと思って触ってみたので、そのメモです。

先に結論だけ書いておくと、新規プロジェクトはもう uv でいいかなと思っています。ただし既存プロジェクトを全部移行するかは別問題で、そのへんも後半で書きます。

この記事でわかること

  • uvって何か、pipと何が違うのか
  • uv inituv adduv runの基本的な使い方
  • Pythonバージョンの固定方法
  • 既存プロジェクトからの段階的な移行手順
  • Docker・GitHub Actions での運用のコツ

uvって結局なんなのか

uv は Astral(Ruffを作っているところ)が開発している、Rust製のPythonパッケージ/プロジェクト管理ツールです。特徴を雑にまとめると「pip + virtualenv + pyenv + pip-tools を1個のコマンドに束ねたもの」という感じ。公称や各種ベンチマークでは pip の10〜100倍速いとされていて、実際に手元で試した範囲でも、キャッシュが効いている状態だと体感が明らかに違います。

バージョンの進み方がかなり速いツールでもあって、2026年3月時点で 0.10.9 が出ていました。今も週次に近いペースでリリースが続いているので、この記事のコマンドが動かないときは uv self update してから uv --version を確認してみてください。まだ 1.0 に到達していないわりに、周辺エコシステムの対応はもう十分すぎるほど揃っています。

pipと何が違うのか

「速い」以外の違いのほうが、実は使い勝手に効いてくる気がします。整理するとこのあたり。

  • 仮想環境を意識しなくてよくなるuv run が勝手に .venv を見て実行してくれるので、activate/deactivate をしなくなります
  • Python本体も管理できるuv python install 3.13 のように複数バージョンを並べて入れられて、.python-version も尊重してくれる。pyenv が不要になりました
  • ロックファイルが標準装備uv.lock が生成される。pip だと pip freeze か pip-tools で頑張るところ
  • 依存解決が厳密:requirements.txt 運用にありがちな「なぜか本番だけバージョンが違う」が起きにくい

逆に pip が有利なのは、環境を選ばないことです。どのPython環境にも最初から入っているという安心感は普通に強い。あとCUDA周りみたいに非Pythonの依存が絡む場合は、素直にconda系を使ったほうが早いこともあるらしいです(自分はGPU環境をあまり触らないので、ここは伝聞です)。

インストールと最初の3コマンド

Macならこれで入ります。Homebrewでも入りますが、公式スクリプトのほうが更新が速い印象。

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

で、最初に覚えるのは uv inituv adduv run の3つだけで十分でした。

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

uv addpyproject.toml が更新されます。さらに uv runuv sync などの「プロジェクト操作」を最初に実行したタイミングで、必要に応じて uv.lock.venv が作られていきます。venv作って、activateして、pip installして、requirements.txt に書き足して……という一連の儀式がなくなるのが、思っていたより快適でした。

他のマシンやCIでは uv syncuv.lock の内容を再現します。CIでは --frozen を付けて、ロックファイルを勝手に更新させず(差分が出たら失敗させる)運用が定番っぽいです。

uv sync --frozen
uv run pytest

あと地味に便利なのが uvxuvx ruff check . みたいに書くと、インストールせずにワンショットで実行してくれます。pipx のポジションですね。CLIツールをとりあえず試したいときにグローバル環境を汚さないので、これだけのために入れる価値があるかも。

Pythonのバージョン固定

uv python install 3.13
uv python pin 3.13

pin すると .python-version が書き換わります。これをコミットしておけば、チーム内でバージョンがズレる事故がだいぶ減るはず。自分は一人開発なので恩恵は薄いんですが、過去の自分と揉めることはあるので……。

既存プロジェクトからの移行

いきなり全部 pyproject.toml 化するのがしんどいときは、pip互換レイヤーから入るのが楽です。uv pip はコマンド体系がほぼ pip と同じで、requirements.txt もそのまま食べてくれます。

uv venv
uv pip install -r requirements.txt

これだけでも「インストールが速くなった」という恩恵は受けられます。段階的に移行したい場合、まずここで慣れてから uv init 側に寄せていくのがよさそう。自分が管理しているLightsail上の小さいスクリプト群は、まだこの状態で止まっています。

逆方向、つまり uv から requirements.txt を吐き出すこともできます。デプロイ先が uv を使えない場合はこれ。

uv export --format requirements.txt --no-hashes > requirements.txt

ついでに書いておくと、PEP 751 で pylock.toml(より正確には *.pylock.toml)という標準ロックファイル形式が決まっていて、uv も --format pylock.toml でエクスポートできます。ツール非依存の形式なので、将来的には uv で作ったロックを他のツールがインストールする、みたいな世界になる予定らしいです。ただ現状の感覚としては、pylock.toml は uv.lock を完全に置き換えるものというより、requirements.txt 的な配布・共有用途で使われることが多い……ようです。プロジェクト内の運用では引き続き uv.lock が使われるケースが多いと思います。

ハマったところ

Dockerで uv sync したら .venv ができてしまって、CMDで指定したPythonから見えない、というやつをやりました。コンテナ内でシステムPythonに入れたいときは環境変数で行き先を変えられます。

ENV UV_PROJECT_ENVIRONMENT=/usr/local
RUN uv sync --frozen --no-install-project  # 依存だけ先に入れてレイヤーキャッシュを効かせる

GitHub Actions は公式アクションがあるので、そっちを使うほうが早いです。enable-cache: true を付けるとキャッシュの保存と復元をやってくれます。体感としては2回目以降のビルドがかなり速くなることが多いので、ここが一番わかりやすく効果を感じた部分かもしれません。

- uses: astral-sh/setup-uv@v5
  with:
    enable-cache: true
- run: uv sync --frozen
- run: uv run pytest

あとこれは仕様というか思想の話ですが、プラグイン機構については(少なくともPoetryみたいな前提での運用は)今のところ噛み合わない可能性があるので、Poetry のプラグインに依存した運用をしているところは移行しづらいかもしれません。自分は Poetry をほぼ使ってこなかったので他人事ですが。

で、乗り換えるべきか

新しく作るものは uv、動いている既存プロジェクトは uv pip でお茶を濁す、というのが今の自分の落としどころです。全部移行しようとして週末が溶けるより、新規から自然に切り替わっていくほうが精神衛生的にいい気がしています。

そういえば Ruff も同じ Astral 製で、pyproject.toml に設定を書けるので相性がいいです。次はこの2つと GitHub Actions をまとめたテンプレートリポジトリを作って、毎回ゼロから書いている初期設定をやめたい。実現すればいいんですが。

※この記事にはプロモーションが含まれます

ちなみに、お名前.com レンタルサーバー(WordPressに特化した高速レンタルサーバー。月額990円〜、独自ドメイン実質0円)も気になっています。お名前.com レンタルサーバー

まとめ

uvの導入は「速さ」だけでなく、仮想環境やPythonバージョンの管理が一気に楽になる利点があります。新規プロジェクトなら迷わず uv で始める価値はありますし、既存プロジェクトも uv pip でワンステップ入ることで、段階的に乗り換えられます。

自分も最初は「また新しいツール……」という気分でしたが、実際に使ってみると source .venv/bin/activate をタイプする回数が激減して、地味に生活の質が上がりました。CIで特に効果が見えやすいので、まずはデプロイパイプラインに組み込むのがお勧めです。

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