🍞

Poetryを辞めてryeを使ってみる

2023/06/01に公開
1

更新

2024/9/21現在は、uvというツールがryeの機能を統合し、より高機能で便利になっているので、そっちを使うことをおすすめします

はじめに

僕は普段Pythonを書いていて、PythonパッケージマネージャとしてPoetryを使っていました。
Poetryは普通に便利なんですが、Pythonインタプリタ自体の管理ができないこととたまーに動作が怪しいことが少し不満でした。そんなときにTwitterでryeという新しいPythonパッケージマネージャが出たらしいというのを見かけて使ってみることにしました。結果としてかなり感触が良かったので、今後もryeを使い続けると思います。

公式リポジトリ: https://github.com/mitsuhiko/rye
公式ドキュメント: https://rye-up.com/

ryeのインストール

※pyenvを消しておく Poetryは残してても多分大丈夫

curl -sSf https://rye-up.com/get | bash

シェルの設定ファイル(~/.bashrc)に以下を追記:

source "$HOME/.rye/env"
$ rye --version
rye 0.3.0
commit: 0.3.0 (85fc3f6a9 2023-05-27)
platform: linux (x86_64)
self-python: cpython@3.10
symlink support: true

PyCharmプラグイン

コードを書くのにIntellijシリーズを使っているので、ryeのPyCharm向けのプラグインを探したところ、https://github.com/koxudaxi/rye-pycharm-plugin が見つかったが、基本的な機能が揃う前に開発が止まっちゃってるっぽい?ドキュメントも404だし。
まあいずれ出てくるだろうから、とりあえずターミナルからコマンド打って使うことにする。

新しいプロジェクトを作ってみる

rye init {project-name}で作る。poetry new {project-name}におおよそ相当かな。
rye initだけだとプロジェクトの雛形が生成されるだけで、インタプリタのセットアップをしたり仮想環境の準備をするにはrye syncとする必要がある。

$ rye init rye-pg
success: Initialized project in /home/nahco314/PycharmProjects/rye-pg
  Run `rye sync` to get started
$ cd rye-pg/
$ rye sync
Downloading cpython@3.11.3
()
Successfully installed rye-pg-0.1.0
Done!
$ ls
README.md  pyproject.toml  requirements-dev.lock  requirements.lock  src

1つ気になったのが、デフォルトのプロジェクトのレイアウトがsrc-layout(src/以下にコードを含むフォルダを置く)なこと。僕はいままでそのままフォルダを置くflat-layoutを使っていて、しかもflat-layoutに変えるオプションも無いようなので困った。
まあそこまでのこだわりもなかったので、ryeへの移行に伴って自分で書くプロジェクトのレイアウトをsrc-layoutにすることにした。

依存関係をいじる

Poetryと同じように、rye add {library-name}で依存関係を追加。--devで開発時のみの依存関係になる。
initと同じように、rye addコマンド単体はpyproject.tomlに依存関係の情報を書き込むだけで、実際にライブラリをインストールしてもらうにはrye syncとする必要がある。

削除はrye remove {library-name]。それはそう。

$ rye add toml
Added toml~=0.10.2 as regular dependency
$ rye add black --dev
Added black~=23.3.0 as dev dependency
$ rye sync
()
Done!

コマンドの実行

rye run {script}でスクリプトを実行できる。Poetryのようにコマンドをそのまま実行するわけではないみたい(なので、rye run lsとかができない)。
rye shellで仮想環境の中に入っているシェルを起動できる。pyenvをちゃんとアンインストールしていないと壊れそうなので注意。

$ rye run python ./src/rye_pg/hello_world.py
Hello,World!
$ rye shell
Spawning virtualenv shell from /home/nahco314/PycharmProjects/rye-pg/.venv
Leave shell with 'exit
$ ls
README.md  pyproject.toml  requirements-dev.lock  requirements.lock  src

インストール

rye install {package}でパッケージをマシンのグローバルにインストールする。
rye uninstall {package}でアンインストール。

開発途中に試したいときなど、ローカルのパッケージをインストールしたいときは、rye install {プロジェクト名} --path .とする。いまのところ、ローカルのパスだけでインストールする方法はなさそう?

$ rye install optuna
Collecting optuna
()
Installed scripts:
  - optuna
$ optuna --version  # プロジェクトの仮想環境内とかじゃなくても使える
optuna 3.1.1
$ rye uninstall optuna
Uninstalled optuna

Pythonインタプリタの管理

ryeでは、Poetryと違ってPythonインタプリタのバージョンの管理が簡単にできる。
rye pin {pytyon-version}とすれば、プロジェクトのディレクトリの下の.python-versionに使うPythonバージョンが設定され、rye syncを実行したときにそのインタプリタが使われるようになる。

Pythonバージョンの記法としては、3.8とか3.8.2とかpypy@3.9.16とかが使える。ローカルにインストール済みのPythonインタプリタに名前を付けて使う、とかもできるっぽい(rye toolchain registerコマンド)。

$ rye pin pypy@3.9.16
pinned pypy@3.9.16 in /home/nahco314/PycharmProjects/rye-pg/.python-version
$ rye sync
()
Done!
$ python -V
Python 3.9.16 (feeb267ead3e6771d3f2f49b83e1894839f64fb7, Dec 29 2022, 14:23:21)
[PyPy 7.3.11 with GCC 10.2.1 20210130 (Red Hat 10.2.1-11)]

コマンドの公開

cliツールとしてコードを実行するには、pyproject.toml[project.scripts]を書く。

[project.scripts]
some-command = "some_command.main:main"

この状態のプロジェクトをインストールすれば、マシンのグローバルにコマンドが追加される。

Poetryのプロジェクトをryeに移行する

とりあえず、pyproject.toml[tool.poetry]セクションを[project]セクションに書き換える必要がある。ところどころ書式が違うので注意。
あとはビルドシステムを変えるとか、flat-layoutだった場合はsrc-layoutにするとか。

ちょっとめんどくさいので、Poetryからryeに移行する手順をある程度自動でやるツールを作ってみた。
https://github.com/nahco314/poetry2rye

まとめ

rye、かなり良さそう。気になることといえば、UIがあんまりかっこよくないこと、IDEプラグインとかの周辺機能が整っていないこと、syncが遅いことぐらい?(いずれ改善されるでしょう)
Python環境の管理ツールは無数に乱立していましたが、ryeがその状況を終わらせてくれたら嬉しいですね。

Discussion

ilzamactilzamact

poetryのプロジェクトをなんとかしてryeで使えないか調べていたらたどり着きました。
便利なツールありがとうございます、大変助かります