ryeをpyenvのように使う

最近は複数のPythonバージョンを用意するのにpyenvを使うのをやめてryeを使っています。

プロジェクトもryeで管理すればいいのですが、OSSメンテしていると良くあるのがIssueの再現のためにスクリプト1つ動かすための環境を作るケースでは若干ryeは面倒です。 src等のディレクトリは不要ですし、addしてからsyncしないといけないし、 python script.py じゃなくて rye runrye shell をしないといけないし。

なので、ryeでプロジェクト管理するよりも、ryeをpyenvのように使うことが多いです。しかも、pyenvを使っていた時はpythonの起動速度が遅くなる事を嫌ってshimsは使っていなかったのですが、ryeはオーバーヘッドがすごく小さいので、shimsにパスを通して rye pin を使って今のディレクトリで利用するPythonのバージョンを選択しています。

環境を一つ作ってライブラリをインストールするまでの手順を書いておきます。まず、普段から使っているエイリアスがこちらです。

# カレントディレクトリ配下に .venv というディレクトリ名で venv を作り有効化する
alias mkvenv='python3 -m venv --upgrade-deps --prompt . .venv && activate'

# すでに .venv がある場合にそれを有効化する
alias activate='source .venv/bin/activate'

また、 rye が管理するプロジェクト以外でもrye pinなどを使ってryeが管理するPythonを使えるようにするために、次の設定をしておきます。

rye config --set-bool behavior.global-python=true

このmkvenvエイリアスとryeを組み合わせて使い捨ての検証環境を作る手順です。

inada-n@macos:~
$ mkdir t && cd t

inada-n@macos:~/t
$ rye pin 3.11
pinned 3.11.7 in /Users/inada-n/t/.python-version

inada-n@macos:~/t
$ mkvenv  # ここでは rye の shims にある python が、 pin したバージョンのpythonを実行してくれる

(t) inada-n@macos:~/t
$ pip -V   # 仮想環境をactivate済みなので、pipもpythonも仮想環境のものを使える
pip 23.3.2 from /Users/inada-n/t/.venv/lib/python3.11/site-packages/pip (python 3.11)

(t) inada-n@macos:~/t
$ pip install msgpack
Collecting msgpack
  Using cached msgpack-1.0.7-cp311-cp311-macosx_11_0_arm64.whl.metadata (9.1 kB)
Using cached msgpack-1.0.7-cp311-cp311-macosx_11_0_arm64.whl (231 kB)
Installing collected packages: msgpack
Successfully installed msgpack-1.0.7

このように、pyproject.tomlを使ったプロジェクト管理をしない場合も、portable pythonをインストールして利用するためだけにでもryeを便利に使えます。

ちなみに上では mkvenv エイリアスを動かすために rye pin 3.11 しましたが、仮想環境を作ってしまった後はこのpinは不要になります。 エイリアスを使わないで直接コマンドを実行する場合は、pinの代わりに python +3.11 -m venv --prompt . .venv のように +3.X の形でバージョン指定できます。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。