はじめに
以前、Pythonのパッケージ・プロジェクトマネージャとしてRyeを紹介しました。現在では、同じメンテナーによって後継である uv の開発が進められていて、新規プロジェクトでは uv の使用が推奨されています。
そこで、今回は uv について紹介します。
uvとは?
uvは、Rustで書かれたパッケージ・プロジェクトマネージャです。仮想環境の構築もすることができ、uvだけでPythonの環境構築から依存パッケージのインストール、プロジェクトの構築などが完結します。Rustで書かれていて、Pythonに依存していません。
と、Ryeと同じ特徴を持っているのですが、実はここ1年くらいでRyeと同じようなことができるようになってきていて、実用度が増してきています。例えばpoetryでモノレポ構成のプロジェクトをuvに移行することができるようになってきました。
uvを使ってみる
uvのセットアップ
まずは、uvを導入します。macOS / Linuxの場合は公式のスクリプトでインストールできます。
(brewでインストールすることもできるのですが、最新版の配信が遅く、最新のPythonを使えないことがあったので、公式スクリプトによるインストールが良いと思います。)
1 | curl -LsSf https://astral.sh/uv/install.sh | sh |
実際にプロジェクトを作ってみます。
1 | uv init sample-project |
初期状態では、以下のようなファイル構造となっています。
1 2 3 4 5 6 7 | . ├── .git ├── .gitignore ├── .python-version ├── README.md ├── hello.py └── pyproject.toml |
pyproject.toml
や
.python-version
といった、Pythonプロジェクトやpyenvでお馴染みのファイルが最初から入っています。実際、uvでもこれらのファイルを使ってプロジェクトが構成されています。
srcディレクトリを置き、その中にパッケージを作るようなディレクトリ構造にするにするには
--package
フラグを使用します。
1 | uv init --package sample-project |
すると、以下のようファイル構造となり、src配下の sample_project パッケージに対して実装をすることができるようになります。
1 2 3 4 5 6 7 8 9 | . ├── .git ├── .gitignore ├── .python-version ├── README.md ├── pyproject.toml └── src └── sample_project └── __init__.py |
この構成の方が、パッケージの外側にテストコードを書く場合に便利だと思います。
ここでsyncを実行することで、.venv内にPython仮想環境が構築されます。
1 | uv sync |
.venv
ディレクトリが生成され、その中に仮想環境が構築されるほか、ロックファイル
uv.lock
も合わせて生成されます。
ちなみに、 pyproject.toml で定義されたコマンドや、仮想環境内でパスが通っているコマンドを実行するには
uv run
コマンドを使いますが、このコマンドは
uv sync
も実行するため、
uv sync
前でも使うことができます。
仮想環境に入る
作られた仮想環境で、Pythonを実行してみます。まず、仮想環境に入るために以下のコマンドを実行します。
1 | . .venv/bin/activate |
すると、以下のようにターミナルの左端にプロジェクト名が表示されるようになります。
1 | (sample-project) ats@MyMacBook-Air sample-project % |
この状態であれば、pythonを使うことができます。
1 2 3 4 5 6 | (sample-project) ats@MyMacBook-Air sample-project % python Python 3.13.1 (main, Jan 5 2025, 06:22:40) [Clang 19.1.6 ] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> print("hello!!") hello!! >>> |
仮想環境を抜けるには
deactivate
コマンドを使います。
依存パッケージの追加
fastapiを追加してみます。
1 | uv add fastapi |
開発用のパッケージは
--dev
オプションを使います。
1 | uv add --dev pytest |
さいごに
私は、現在ではpoetryプロジェクトの移行先にuvを使っていますが、以前はryeを使っていました。uvとryeは使い勝手や仕組みは似ているものの、完全に同じという訳ではないので、ryeプロジェクトは無理にuvに移行する必要はないかなと思いました。
uvの方が便利、使いたい機能がある! という場合は、ryeからの移行もありだと思います。また、現状poetryを使っている場合は、ぜひuvに移行してみてください!