🤯

ryeを使って任意のバージョンのPython仮想環境(venv, pipenv, poetry)を構築するメモ

2024/06/19に公開

末尾の方uvを使って同じことをやる場合についてのメモを追記(2024-10-21)


何を言っているか分からないタイトルになってしまったが、
ryeをがっつり使うのではなく、ryeの指定した任意のバージョンのPythonをダウンロードして使用できる機能だけを利用して、実際の環境構築・管理は他のツールでやることも出来る、というメモ

はじめに

rye:

https://rye.astral.sh/

の特徴・利点の一つに、

https://rye.astral.sh/guide/toolchains/

に書いてあるように、

https://github.com/indygreg/python-build-standalone

を利用して指定したバージョンのCPythonをダウンロードして利用することができる。

この、「Pythonのバージョンを指定して切り替えを行う」ということに関して、
以前はpyenvなどを使って行っていたりしたが、ビルドが走って時間がかかったり依存関係を別途インストールしないといけなかったりと色々不便だった。

あるいは以前に

https://zenn.dev/junkor/articles/eb42a0aeb231e3

に書いたようにminiforge + condaを使うやり方で欲しいバージョンのPythonをダウンロードする、といったこともやっていたが、これも目的(所望のバージョンのpythonをインストールして使う)に対して大仰&面倒な感じはしていた。

ので、

https://methane.hatenablog.jp/entry/2024/01/31/ryeをpyenvのように使う

を参考にpyenvなどの代わりとしてryeを使うのが比較的手軽で簡単に思えてきたためやってみた、という感じ。

(検証環境)

  • OS: Linux x86_64(WSL2)
    • Fedora40
  • rye: version 0.34.0(d31340178 2024-05-20)
    • self-python: cpython@3.12.2

各環境構築手順

前提条件として、いずれの手順においても

https://rye.astral.sh/guide/installation/#preventing-auto-installation

のLinux版のryeがインストールされており、.bashrc.zshrcなどで

source "$HOME/.rye/env"

などによって設定ファイルが読み込まれていることとする。

1. venv仮想環境を作る場合

標準機能で使えるvenvを使って簡素に仮想環境の構築を管理をする場合。
最も簡単かつ基本的な手順となる。

まずは環境構築を行うディレクトリを作成し、そこに移動する。

# ↓場所やディレクトリ名は適当に書き換え
mkdir -p /path/to/venv-project
cd /path/to/venv-project

https://rye.astral.sh/guide/toolchains/

の"Pinning Toolchains"に記載されているように、rye pin <バージョン>コマンドによって.python-versionファイルを作成し、そこでのPythonのバージョンを指定・固定することができる。

例えばPython3.11を使いたい場合、

# バージョンは適宜書き換える

rye pin cpython@3.11

# または`cpython@`を省略して↓のように書いてもOK
rye pin 3.11

のようにすると、

.python-version
3.11.9

のようなファイルが作成される。
パッチバージョン部分(.9)はその時の最新になるので、数ヶ月経つとおそらく変わる。

パッチバージョンまで固定したくない場合はrye pin <バージョン> --relaxedのようにすることもできる。

この状態だとryeは.python-versionに記載されたバージョンのpythonを使おうとするので、これでvenv仮想環境を作ればOK。
ただし、指定されているバージョンのPythonをダウンロード済みである必要があるので、rye fetchコマンドを実行して適宜ダウンロードする。

# .python-versionで指定されているバージョンのPythonをダウンロードしていない場合に↓を実行
rye fetch

# 普通に仮想環境を作成する。ここのpython3は↑のrye fetchで取得したものが使われる
python3 -m venv .venv

# 仮想環境の有効化
source .venv/bin/activate

# パッケージのインストール(↑で仮想環境有効化済み)
python3 -m pip install <適当なパッケージ>

ここで、ls -lなどで確認すると、.venv/bin/python3(シンボリックリンク)の実体は$HOME/.rye/py/cpython@3.11.9/bin/python3などを指していることが分かり、指定したバージョンでvenv仮想環境が作成されていることが分かる。
pipなどでインストールしたパッケージも.venv/lib/python3.11/site-packagesに格納されていることが確認でき、意図通りに動いていることが分かる。

後は普通にこの仮想環境を使って開発や作業をしていけば良い。

2. pipenvでプロジェクトを管理する場合

pipenv自体のインストールがされていない場合、

https://rye.astral.sh/guide/tools/

などを参考に、グローバルツールとしてpipenvをインストールしておく。

rye install pipenv

# バージョン確認
pipenv --version
# ↑検証時では`pipenv, version 2024.0.1`

後の手順に関して、
空のvenv仮想環境を作る部分までは1. venv仮想環境を作る場合と完全に同一。

すなわち、

# ディレクトリ作成と移動(適当に変える)
mkdir -p /path/to/pipenv-project
cd /path/to/pipenv-project

# バージョン指定
rye pin <所望のPythonバージョン>

# 必要に応じて↑で指定したバージョンのPythonをダウンロード
rye fetch

# venv仮想環境作成
python3 -m venv .venv

をまずはじめに行う。

この状態で

pipenv lock

など、適当にpipenvのコマンドを実行するとPipfilePipfile.lockが作成され、pipenvのプロジェクトが自動で作成される。
このとき、初めから.venvがある場合、pipenvはその.venvを使用するため、ryeによってバージョン指定・取得したPythonを利用するpipenv環境を作ることができる。

注意点として、(繰り返しになるが)pipenvコマンドを実行するより先に空の仮想環境.venvを作っておく必要があり、
さもないとpipenv自体は.python-versionを利用しないので異なるバージョンのPythonを使ってしまう。

3. poetryでプロジェクトを管理する場合

まず、poetry自体をインストールしていない場合、先ほどのpipenvと同様に

rye install poetry

# バージョン確認
poetry --version
# ↑検証時ではPoetry (version 1.8.3)

のようにしてインストールしておく。

後は2. pipenvでプロジェクトを管理する場合と全くと言っていいほど同様にして出来る。

# ディレクトリ作成と移動(適当に変える)
mkdir -p /path/to/poetry-project
cd /path/to/poetry-project

# バージョン指定
rye pin <所望のPythonバージョン>

# 必要に応じて↑で指定したバージョンのPythonをダウンロード
rye fetch

# venv仮想環境作成
python3 -m venv .venv

のようにして先に空でかつ所望のバージョンのvenv仮想環境(.venvディレクトリ)を作っておき、
その状態で

poetry init

# ↑デフォルトでは対話型で色々聞かれるので、
# Pythonのバージョンは`rye pin`により`.python-version`ファイルで指定したものと同様のものを答えておく

のようにしてpoetryのプロジェクトを作成すればOK。

pipenvの場合と同様、先に予め.venvがあればpoetryはそれを使って動作するので、
ryeで指定・取得したバージョンのPythonで動作するpoetryプロジェクトを作ることができる。

おわりに

ryeが安定・普及しきって他のツールとの連携性も十分な感じになれば、この記事で書いたような(ややこしい)ことはやらなくて済むようになるので早くそうなることを願うばかり。
(個人開発以外でも基本的にryeで完結出来るようになってほしい)

具体的には、

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-lambda-python-alpha-readme.html

https://aquasecurity.github.io/trivy/v0.52/docs/coverage/language/python/

などで、執筆時点ではpipenvおよびpoetryはサポートされているがryeはまだだったり、といったことなどもあり、
ryeでプロジェクト管理までやるのはまだ慎重になった方が良いケースがあったため、渋々今回のような方法を調べていたり、という経緯があったりする。

追記 2024-10-21

(本記事の内容をuvでやるためのメモ)

https://astral.sh/blog/uv-unified-python-packaging

や、

https://lucumr.pocoo.org/2024/2/15/rye-grows-with-uv/

などを見るに、ryeはゆくゆくはuvで置き換えられていく流れだと考えられる。
(というか現時点で既にuvで置き換えてもほぼ問題無いように思う)

この記事の内容について、uvで相当のことを行うには

before(rye):

# before(rye)
rye pin python@3.X.X
rye fetch
python3 -m venv .venv

# pipenv <コマンド>やpoetry initなど

after(uv):

# after(uv)

# rye pin と同じく.python-versionを作成する↓
uv python pin 3.X.X

# ↑で作成した.python-versionファイルで指定したバージョンのPythonでvenv仮想環境(.venv)を作成:
uv venv

# pipenv <コマンド>やpoetry initなど

のような感じで置き換えるとuvを使っても同じことが出来る。

なお、uvはpipを置き換えるものでもあるため、
uv venvで作成した仮想環境にpipは含まれない。

代わりに、uv pipサブコマンドがpipの代替となるが、
素のpipを使う必要があれば、

# uv venvで作成したvenv仮想環境(.venv)がある場所で↓を実行
uv pip install pip

のようにすると良い。

GitHubで編集を提案

Discussion