🐍

フロントエンドエンジニアのためのuv入門【Python】

に公開

「フロントエンドエンジニアだけどPythonの環境構築をしなければならない」ってこと、たまーにあります(最近の自分)。

……でも今のPythonってどんな感じか分からん!ということで調べてみると、uvというツールがあり、それがデファクトになりつつあると知りました。フロントエンドの人間から見てPythonの環境構築周りのツールがどうなっているのか、そしてuvとは何なのかを書いてみます。

同業でPythonを触る必要が出てきた/触ってみたい人の参考になればうれしいです。

https://docs.astral.sh/uv/

「Pythonといえばpip」はもう古い

僕がPythonに初めて触れたのは大学生の頃でした。当然ライブラリ管理と言えばpipです。これはフロントエンド文脈でいうところのnpmと同じですね。
言わずもがなpip install [パッケージ名]という使い方。

個人的な思い出

当時は機械学習の盛り上がりもあり、僕は研究でconda(Anaconda) というツールを使っていました。懐かしい。。

単に上記のイメージ、そして仮想環境を作るのにvenvやpipenvがある記憶だったのですが、これはもう古く、冒頭のuvが最近台頭しているとのこと。
しかし一足飛びにuvの説明を見ても「??」だったので、これまでの歴史もふまえて整理して比較しました。

Pythonのプロジェクト管理系ツールはフロントエンドでいうと何?

PythonとNode.js文脈のツールたちの対応を表にすると、次のようになると思います。

機能カテゴリ Pythonの従来ツール Node.jsでの対応ツール 補足説明
パッケージ管理 pip npm, yarn, pnpm 外部ライブラリをインストール・更新する最も基本的なツール。シンプルだが、依存の一貫性は保証しない。
仮想環境管理 venv, virtualenv nvm, Volta Pythonはプロジェクトごとに依存環境を分けるのが標準。Nodeではランタイム切替ツールが近い概念。
グローバルツール実行 pipx npx CLIツールを一時的に実行できる。構文や用途が非常に似ている。
プロジェクト設定ファイル pyproject.toml, setup.cfg package.json プロジェクトの依存やメタ情報を記述する中心的ファイル。近年はpyproject.tomlに統一が進む。
依存関係ロック requirements.txt, Pipfile.lock, poetry.lock package-lock.json, yarn.lock 依存を固定して再現性を確保。requirements.txtは手動更新、Pipfile.lockpoetry.lockは自動生成。
統合パッケージ管理 pipenv, Poetry, PDM (概念的にはBunが近い?※) 依存解決・仮想環境・スクリプト実行・ロックファイル生成を一体化。pipenvPipfileを利用。
Linter / Formatter flake8, black, isort, ruff eslint, prettier, biome コード品質やスタイル統一を支援。どちらの言語でも定番ツール。

※BunはNode.jsのランタイムごと中華まん内部に飲み込んでいるので、ランタイムを飲み込まないPython側のツールとは異なります

uvはイマの「統合パッケージ管理」ツール

上記の表のように、Pythonのエコシステムで開発者はツールの分散に悩んできたことがうかがえます(フロントエンドも同じですね)。

そこで、「バラバラのツール群を統合しよう」という流れが出てきます。最初に出てきたのは2017年のPoetryでした。Poetryは依存管理、仮想環境、lockファイルやパッケージの公開を統合しました。
しかし、Poetry自体がPython製で動作が遅いという指摘があったそうです。

じゃあこの遅さを解決しようということで2023年に出てきたのがRyeというツール。
pipを開発した中の人の一人がRustで開発したとのことで、懸念だった速度の問題を解決しました。
しかし、その独特なプロジェクト管理ファイルの形式により、pipやPoetry環境からの移行のしづらさがあったようです。

そこで2024年、満を持して登場したのがuvです。
uvはAstral社という会社が開発したもので、こちらもRust製。主な特徴は以下(公式ドキュメントより抜粋・意訳)。

  • 🚀 pip、pip-tools、pipx、poetry、pyenv、twine、virtualenvなどを1つで置き換えるツール
  • ⚡️ pipより10〜100倍高速
  • 🗂️ 汎用的なロックファイルを備えた包括的なプロジェクト管理
  • ❇️ インライン依存メタデータ付きでスクリプトを実行可能
  • 🐍 Pythonバージョンのインストールと管理をサポート
  • 🛠️ Pythonパッケージとして公開されたツールの実行・インストールが可能
  • 🔩 pip互換のCLIインターフェースを備え、操作性を損なわずに性能を向上
  • 🏢 Cargo(Rust)スタイルのワークスペースをサポート
  • 💾 依存を重複なくキャッシュするグローバルストアで、ディスク効率が高い
  • ⏬ RustやPythonがなくても、curlやpipから直接インストール可能
  • 🖥️ macOS、Linux、Windowsをサポート

この「終わらせましょう」と言わんばかりの気合の入ったツールが、現在Python界隈を席巻しているというわけです。僕も実際に環境構築+αくらい触ってみたのですが、速い・(学習コストが)安い・美味いを感じました。

特に感動したのは、Pythonを実行するときに自動的にPython自体やライブラリを設定ファイルに指定したバージョンで実行してくれること。つまり、今まで必要だった「仮想環境に入る(pipenv shell的な)」操作が不要でした!(Poetryからそうなのか…?)

uv環境セットアップからFlask表示までの最小手順

以下はお試しの例として、uvのインストール → プロジェクト作成 → Flask導入 → ローカル表示までの手順です。

0) uvのインストール

インストールについては、OSや運用によって異なるので詳しくは公式の手順をご覧ください。

macOS/Linux
# 以下のどれか
curl -LsSf https://astral.sh/uv/install.sh | sh
wget -qO- https://astral.sh/uv/install.sh | sh
curl -LsSf https://astral.sh/uv/0.9.5/install.sh | sh
Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

なんならpip install uvもOK(互換性への配慮が厚い)。

1) プロジェクトの初期化

uv init uv-flask-min
cd uv-flask-min

uv init は、.venv/pyproject.toml を自動生成し、初期状態の仮想環境を整備します。これにより、uv venv を手動で実行する必要はありません。

2) Flaskのインストール

「あれ?Pythonのインストールは?」 と思いましたか?僕も思いました。それはinitの時点でもう終わっているのです(びっくり)。システムにすでにPythonがある場合はそれを使い、なければ仮想環境内に自動で取得するようです。
ということでFlaskを追加しましょう。

uv add flask
  • 初回に uv.lock が自動生成されます。
  • 依存はグローバルキャッシュに保存され、以後の導入が高速になります。

3) アプリコードの作成(app.py

from flask import Flask

app = Flask(__name__)

@app.get("/")
def hello():
    return "Hello, uv + Flask!"

if __name__ == "__main__":
    # デバッグ用の簡易サーバーを起動します。
    app.run(debug=True, host="127.0.0.1", port=5000)

4) アプリの起動

uv run python app.py

ログに Running on http://127.0.0.1:5000/ と表示されます。

5) ブラウザで表示

http://127.0.0.1:5000/

Hello, uv + Flask! と表示されれば成功です。

補足

  • 依存は pyproject.toml / uv.lock に記録されます。リポジトリにコミットして再現性を担保します。
  • 仮想環境を削除する場合は .venv/ を削除します。

おわりに

フロントエンドエンジニア(?)なのに久しぶりの記事がこれなのどうなん????ってなりながら書いていますが、とはいえ全方位に最低限のアンテナを立てておきたいなと改めて思う次第です。

uvを知った時に似たようなもので思いついたのはBunですが、フロントエンド界隈ではあの中華まんがそれほど実運用で使われるケースを見ないのはなぜなのでしょうか。。uvにはない、テスト機構とランタイム自体すら内包しているのに。
これから盛り上がってくるのかな?

Discussion