📘

pyenv+virtualenv/poetryからuvに乗り換えた話

に公開

今回は、Pythonの仮想環境管理とライブラリ管理をuvに乗り換えた経緯と使い方などについて解説していきたいと思います。

乗り換えるまでどうしていたか

uvに乗り換えるまでは、仮想環境にpyenv + virtualenv、ライブラリ管理にはpoetryを利用していました。

仮想環境にpyenv+virtualenvを利用していた理由ですが、何か大きな理由があったというわけではなく、環境構築がうまくいって使い慣れていたのでずっと使っていた感じです。

poetryについてはuvなどが出てくるまではスタンダードなツールだったと思います。私もその流れに乗って使っておりました。poetryを使うまではrequirements.txtでライブラリ管理をしていましたが、ライブラリのバージョン管理をする必要性に気づいてからはpoetryを採用しておりました。

なぜuvに乗り換えたのか?

まず、uvはこちらのリポジトリで管理されているツールです。
https://github.com/astral-sh/uv

以前の環境で大きな問題があったというわけではないです。ただ、以下のような理由で乗り換えようかなと思っておりました。

  • 周りの開発者がこぞってuvを利用していた
  • 参照するリポジトリの多くがuvを採用していた
  • uvだとライブラリのインストールが爆速と聞いた
  • ライブラリ管理だけでなく仮想化もできる

uvが出始めたからというもの、周りの開発者がどんどんuvを使ってみていい感想を共有していたので使ってみたいと思っていました。もちろんpoetryなどにもそれの良さはあると思いますが、開発者コミュニティでいいとされているものは積極的に取り入れていかないといけないなと思っていました。

また特に大きいのがライブラリのインストールについてです。実際にpoetryとuvで同じライブラリをインストールすることを考えてもuvの方がとても早い気がします(時間を測ったわけではないです)。

そしてやはり仮想環境の管理もできるというのがとても大きいです。以前はpyenvとvirtualenvを使って仮想環境を構築し、pipでpoetryをインストールしてpoetryでライブラリを管理する、といった構成で対応していました。読んで分かる通り、手順が多すぎました。正直何もみずに構築できるレベルで慣れてはいるので抵抗自体はないですが、uvコマンド単体でできることを考えると、移行しない理由がありませんでした。

uvに移行して思ったこと

ひとえに「楽」ですね。仮想環境構築からライブラリのインストールまで、あまりにシンプルすぎて逆に怖いくらいです。

uvの使い方についてちょっとまとめてみる

せっかくなので備忘録としてuvの使い方をまとめてみようと思います(といっても公式ドキュメントの引用です)。

インストール

自分はこちらの方法でインストールしました。

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

プロジェクト作成

プロジェクトフォルダを作成するには以下のコマンドを実行するだけでできます。

uv init <name>

また、作成する際に合わせてPythonのバージョンを指定する場合は以下のように-pオプションをつければ対応可能です。

uv init <name> -p <pythonバージョン>
# 3.10にしたい場合 uv init <name> -p 3.10

フォルダが作成されると、自動的に以下の構成を作ってくれます。

drwxr-xr-x   - ... 29 4 11:31  .git
.rw-r--r-- 109 ... 29 4 11:31  .gitignore
.rw-r--r--   5 ... 29 4 11:31  .python-version
.rw-r--r--  89 ... 29 4 11:31  main.py
.rw-r--r-- 157 ... 29 4 11:31  pyproject.toml
.rw-r--r--   0 ... 29 4 11:31  README.md

もし既存の環境でuvを利用したい場合はそのフォルダ内で以下のコマンドを実行するだけで対応できます。

uv init

仮想環境のアクティベート

uvで作成されたフォルダでPythonを実行すると、自動的に指定されたバージョンで実行されるようになります。

ライブラリのインストール

ライブラリを追加するには以下のようにコマンドを実行します。バージョンを合わせて指定すると対応したバージョンのライブラリを追加できます。

uv add <ライブラリ名>
# バージョン指定したい場合
uv add '<ライブラリ名>==2.31.0'

また、リポジトリを参照してインストールするようなライブラリを使う場合も、以下のように指定対応可能です。

uv add git+https://github.com/<リポジトリパス>

ライブラリを更新したい場合、以下のようにすると更新できます。

uv lock --upgrade-package <ライブラリ名>

既存設定からライブラリをインストール

例えばリポジトリを取得して、その中で定義されているuvの環境を再現したい場合、以下のコマンドを実行すれば完了です。

uv sync

コマンドの実行

例えばflaskをコマンドとして実行する場合は以下のようにすることで対応できます。

uv add flask
uv run -- flask run -p 3000

また、Pythonスクリプトを実行したい場合は以下のように実行できます。

uv run hoge.py

まとめ

今回はpyenv+virtualenv/poetryからuvに乗り換えた話と、簡単な使い方をまとめました。正直使い勝手としては圧倒的にuvがいいですし、動作速度もとても快適です。とはいえ、pyenvなどを使う方法も慣れているから、そこまで苦ではなく名残惜しさも少しありますw。でも、使ってみるとuvがデファクトスタンダードになる気がしているのでこの際ちゃんと乗り換えようと思います。みなさんもぜひ使ってみてください。

Discussion