Poetryを辞めてryeを使ってみる
更新
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に移行する手順をある程度自動でやるツールを作ってみた。
まとめ
rye、かなり良さそう。気になることといえば、UIがあんまりかっこよくないこと、IDEプラグインとかの周辺機能が整っていないこと、syncが遅いことぐらい?(いずれ改善されるでしょう)
Python環境の管理ツールは無数に乱立していましたが、ryeがその状況を終わらせてくれたら嬉しいですね。
Discussion
poetryのプロジェクトをなんとかしてryeで使えないか調べていたらたどり着きました。
便利なツールありがとうございます、大変助かります