はじめに
Pythonでアプリケーションやパッケージを開発する場合、これまでは仮想環境であるpyenvと、プロジェクト・パッケージ管理ツールのpoetryを組み合わせて開発することが多かったと思います。
それが、Ryeの登場によって、少し変化しそうです。今回は、Ryeを使って、プロジェクトの作成や依存パッケージのインストールなどを試してみたいと思います。
Ryeとは?
Ryeは、これらの仮想環境の管理と、プロジェクト・パッケージ管理の両方ができるツールです。Rustで書かれていて、Pythonに依存していません。
個人的に、Ryeを使った時の嬉しいポイントは「仮想環境の管理」と「プロジェクト管理」が統合されていることです。
pyenvとpoetryを組み合わせて使う場合には、poetryに対してpython環境を設定する必要があるのですが、特にPythonをアップデートする場合などにとても面倒です。
例えば、Python 3.12.2 -> 3.12.3にアップデートする場合、以下のようなコマンドを順番に実行する必要があり、とても手間です。
1 2 3 4 5 | poetry env remove 3.12.2 pyenv install 3.12.3 pyenv local 3.12.3 poetry env use 3.12.3 poetry install |
これが、ryeを使う場合には、以下のコマンドだけですみます。
1 2 | rye pin 3.12.3 rye sync |
これだけでもめちゃくちゃ良い感じですね!
その他に、ユニークな機能として、標準でRustによるPython拡張モジュールを作成できるオプションも用意されています。
ちなみに、RyeのオーナーであるAstral.shは、他にも「uv」というパッケージマネージャや、「Ruff」というリンター兼フォーマッタやという開発しています。
Ryeも、仮想環境の構築や、パッケージ管理には「uv」を使っています。
またデフォルトで
rye lint
や
rye fmt
コマンドが使用可能で、実際にはRuffがlintやフォーマットをかけてくれます。
(Ruffは、現状flake8やblackの代替えにはなりますが、pylintの代替えに向けては実装中とのことです。)
Ryeを使ってみる
Ryeのセットアップ
まずは、Ryeを導入します。macOSの場合はbrewでインストールできます。
1 | brew install rye |
実際にプロジェクトを作ってみます。
1 | rye init sample-project |
初期状態では、以下のようなファイル構造となっています。
1 2 3 4 5 6 7 8 9 | . ├── .git ├── .gitignore ├── .python-version ├── README.md ├── pyproject.toml └── src └── sample_project └── __init__.py |
pyproject.toml
や
.python-version
といった、Pythonプロジェクトやpyenvでお馴染みのファイルが最初から入っています。実際、ryeでもこれらのファイルを使ってプロジェクトが構成されています。
ちなみに、セットアップした時点では、Python 3.12.3が指定されていました。
ここでsyncを実行することで、.venv内にPython仮想環境が構築されます。
1 | rye sync |
実際のところは、仮想環境を構築するだけでなく、pyproject.tomlに記載された依存パッケージのインストールや、ロックファイルの生成も行われます。
ここまで構築できれば、
rye run
で仮想環境内でのコマンドを実行することができます。(
poetry run
と同じ使い方ができます。)
仮想環境に入る
作られた仮想環境で、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.12.3 (main, Apr 15 2024, 17:43:11) [Clang 17.0.6 ] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> print("hello!!") hello!! >>> |
依存パッケージの追加
fastapiを追加してみます。
1 | rye add fastapi |
開発用のパッケージは
--dev
オプションを使います。
1 | rye add --dev pytest |
ここまで実行すると、pyproject.tomlにパッケージが書き込まれますが、実際にインストールしてlockファイルに書き込むには
rye sync
する必要があります。
ちなみに、lockファイルは requirements.txt と同じフォーマットで出力されるため、プロダクションへのデプロイにDockerを使用する場合は、このロックファイルを使って
pip install -r requirements.lock
とするだけで依存パッケージをインストールできます。
また、開発用のパッケージは上記のロックファイルには含まれないため、開発用のパッケージがインストールされてしまうこともありません。(
requirements-dev.lock
という別のロックファイルが生成されます。)
この仕組みにより、Dockerビルドする際には、ロックファイルさえあれば、ryeを使うことなく依存パッケージをインストールすることができます。
VSCodeから使ってみる
VSCodeでこのプロジェクトを開いてみたところ、.venv内のpythonインタプリンタを自動的に認識し、依存パッケージも問題なく認識しました。
また、ターミナルも仮想環境に入った時と同じく、pythonや依存パッケージのコマンドへのパスが通っている状態でした。
FastAPIが使えるか確認するため、
src/sample_project/main.py
にこちらのFastAPIのサンプルコードを貼り付けて、以下コマンドで実行してみます。
1 | uvicorn src.sample_project.main:app --reload |
http://localhost:8000/
にアクセスすると、問題なくJSONレスポンスが返ってきました。もちろん、ホットリロードも問題なく動いていました。
さいごに
Ryeには、pyenvとpoetryを組み合わせていたときのような複雑さは無く、簡単に環境構築ができる上に、VSCodeでの開発も問題なくできそうでした。まだ実戦投入はしていませんが、どこかでRyeに切り替えていきたいなと思いました。