Pythonのパッケージマネージャuvで環境構築してみた
まえがき
Node、TypeScript を触っていますが、
AI 関連やデータ分析関連で Python を使うこと多いため、Python も勉強しはじめました。
今回は Python の環境構築していこうと思います。
なるべくローカル PC 汚さずプロジェクトごとに環境を構築するのが無難だと思います。
Docker などつかって別環境自体をつくっちゃうのもあるけど、
最初の一歩として、シンプルにプロジェクト単位でパッケージ管理が分離できれば OK とします。
Python 環境、ライブラリーなど管理のパッケージマネージャは pip、venv、pyenv、Conda、Poetry、Pipenv、Rye、uv などがあるみたいですね。
歴史的な背景は、ちょっと弱いので、その辺は他の方にお任せするとして、
今から新規で始めるなら、uv がおすすめと聞いたので、uv で環境構築していきます。
uv の立ち位置
とはいっても、背景もわからずにツールを使い始めると、痛い目にあうので uv の立ち位置について簡単に調べました。
Astral 社が 2024 年の 2 月中に uv を発表して、新しいめのツールです。
uv の前に Rye というツールがありました。ざっくり理解したのは、Rye 自体は個人プロダクトで、uv は Rye リスペクトで Astral 社が作ったツールみたいで、Rye の作者も良い感じも認めているっぽいと。uv も Rye も Rust 製のツールです。
Astral 社は、Python の linter の Ruff を作っているらしい。こちらも Rust 製のツールです。
Web 界隈でも Rust 製の置き換わる動きがありますが、Python でも Rust 製置き換わるブームがきているじゃないかなっと勝手に想像しました。
最初の一歩目として長いものに巻かれるほうがよいので、著名な方の巨人の肩にのっていこう。
ざっとコマンドをみてみると、普段、npm、pnpm、yarn,bun に慣れた身からすると Syntac 的にも uv あたりがとっつきやすそうに思います。
uv で新しいプロジェクトを作る
サンプルで FastAPI のアプリを uv で作ってみます。
uv のインストール
以下、私は Mac PC で環境構築している例になります。ご自身の公式ドキュメントをみながらインストールしてください。
curl -LsSf https://astral.sh/uv/install.sh | sh
プロジェクト作成
$ uv init fastapi-app
Initialized project `fastapi-app` at `/YOUR PATH/fastapi-app`
cd fastapi-app
ライブラリーの追加
$ uv add fastapi --extra standard
ライブラリーのダウンロード
$ uv sync
npm install とほぼ同じような感覚だと思います。このとき.venv も作成されます。
プロジェクト単位で区切られた Python 環境のつくっているみたいで、プロジェクトごとに Python のバージョンのロックもできるようです。
Node 場合だと mise,asdf,nodeenv,anyenv 系のツールで管理することが多いですが、uv は標準でついてくるんですね。
参考: Python のバージョンロック(3.12 でバージョン固定する)
$ uv python install 3.12
$ uv python pin 3.12
Updated `.python-version` from `3.11` -> `3.12`
$ uv sync
.python-version が作られて、バージョンが記録されています。これでどの環境でも python のバージョンを揃えられますね。
FastAPI のアプリのコードを実装
app/main.py
を作成します。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
FastAPI の実行
$ uv run fastapi dev
にアクセスして、{"Hello":"World"}
と表示されて、動作確認ができました。
まとめ
普段 Bun とか使っていますが、uv はあんまり体感的な差はなくキビキビ動いている感じします。
そして、コマンドなど似てたりするのでとっつきやすかったです。
ローカル環境もあまり汚さずトライアンドエラーできる環境がつくれるので uv をベースにしていこうと思います。