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で使えないか調べていたらたどり着きました。
便利なツールありがとうございます、大変助かります