Pythonの環境構築ツールRyeの紹介

## 追記(2024-08-31)

- ryeがuvに置き換わったようです
    - [uvだけでPythonプロジェクトを管理する](https://zenn.dev/turing_motors/articles/594fbef42a36ee)
- ちょっと触った限りではコマンドを`rye` -> `uv`で置き換えるだけで、表向きはRyeと同じ使用感でいけそうでした
- 既存プロジェクトで`rye -> uv`と乗り換える場合は下記ファイルを削除して`uv sync`をすれば良さそう…？
(あと`pyproject.toml`の変更は`[tool.rye]` -> `[tool.uv]`？)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198225/e41f94f2-6212-71d8-036e-515e0548e7df.png)

## はじめに

- 私が Python を始めるにあたってぶち当たった最初の壁が環境構築でした
- 本やブログのチュートリアルの通りにうまくいけば良いのですが、エラーに遭遇して頭をかかえることが多々ありました
- 思い返すといろんな方法でインストールしたもの同士が喧嘩して、Python の環境が管理しきれなくなってる状態でした。(Anaconda と pip が喧嘩したり、現在の Python の PATH がどこを指しているか分からない状態だったり…)
- ま いいか！と適当な管理で Python を使っていたのですが、いざチームでの運用や複数のプロジェクトを管理するにあたって、真面目に環境構築を考える必要がでてきました
- こんな私でもいざ使ってみるとこりゃ便利だなあと手のひらを返したわけでして、本記事で環境構築の目的やそのためのツールである Rye を紹介したいと思います

## 参考

- [python パッケージ管理ツール rye を使う](https://nsakki55.hatenablog.com/entry/2023/05/29/013658)
- [【Python のパッケージ管理に悩む方へ】パッケージ管理ツール Rye を使ってみた](https://dev.classmethod.jp/articles/get-start-rye-python/)
- [Rye による Python 環境構築](https://kiririmode.hatenablog.jp/entry/20240105/1704466799)
- [Python Version Managers](https://mac.install.guide/python/install-pyenv-or-rye)
- [Pythonの開発環境の3つの観点をおさえよう
](https://zenn.dev/os1ma/articles/935f6e653f1052)

## 環境構築について

### 環境構築で達成したいこと

- そもそも Python の環境構築で何を達成したいのかというと、下記の 3 点が挙げられます
  - 1. Python のバージョン管理
  - 2. プロジェクトごとに Python の仮想環境を作成
  - 3. プロジェクト内のパッケージを管理

---

- 1. Python のバージョン管理
  - プロジェクト毎に使用している Python のバージョンが異なります
  - そのため Python のバージョンを複数管理して、任意のバージョンのものを使えるようにしたいです
- 2. プロジェクトごとに Python の仮想環境を作成
  - 例えば`Python 3.12.x`が一つしかないと、プロジェクトによって必要でないパッケージが入ったり、パッケージのバージョンが合わない場合がでてきます
  - そのため`Python 3.12.x`を複製し`プロジェクトX`や`プロジェクトY`など、プロジェクト毎に Python の仮想環境を作成する必要があります
- 3. プロジェクト内のパッケージを管理
  - プロジェクトで利用するパッケージやそのバージョンの管理を行う必要があります
- 図にすると下記のような仕組みを実現させたいということになります。

<img width="800" alt="image" src="https://i.imgur.com/owoMYXP.png">

### 環境構築用ツールのトレンド

- Python の環境構築用のツールはこれまでいくつかのトレンドの遷移があり、私が使ってきた範囲では以下の流れでした
- `pyenv/pyenv-virtualenv/requirements.txt(pipで作成)` -> `pyenv/poetry` -> `rye`(← 今ここ)
  - [pyenv と pyenv\-virtualenv の自分流使い方](https://qiita.com/ksato9700/items/5d9eba10fe6b8e064178)
  - [Poetry をサクッと使い始めてみる](https://qiita.com/ksato9700/items/b893cf1db83605898d8a)
  - [【Python のパッケージ管理に悩む方へ】パッケージ管理ツール Rye を使ってみた](https://dev.classmethod.jp/articles/get-start-rye-python/)

![75C05FE7-ECF6-4F74-8811-0807DC93954A](https://i.imgur.com/NpYJ1y8.png)

- 定期的に新しいツールが出てきてキャッチアップが大変ではあるのですが、段々とツールがまとまって話が簡単になってきており、使う側としても好ましい変化だと思っています
- そして今回は現在流行っている`Rye`を紹介したいと思います

## Rye について

### 概要

- Rye は Python のバージョン管理とプロジェクトのパッケージ管理をまとめて行えるツールです
- 前述の図の通り`pyenv`と`poetry`の機能を併せたものになっており、より環境構築が簡単にできるようになりました
- 1 つ懸念があるとするとまた`実験的`ということで、採用する際はこの点を一考する必要があります
  - (ただ私が調べた限り現在この文言が見当たらず、もしかしたら`実験的`というのは取れているかもしれません)

> https://dev.classmethod.jp/articles/get-start-rye-python/
> Rye は Rust の rustup と cargo にインスパイアされた、Python の新しいパッケージング体験を構築する実験的な試みとなっており、作者により「Production Ready ではない」と紹介されていますが、検証用等個人で使用するには使い勝手はかなり良かったのでご紹介致します。

### Rye のインストールの手順(macOS)

- `macOS 14.1.2 (23B92)`において、Rye の開発環境を構築していきます
- まずは README の通り Rye のインストールを行います
  - https://github.com/astral-sh/rye?tab=readme-ov-file
- Homebrew でもインストールできると思うのですが、技術記事が少なかったり後述の`pip/uv`を選ぶ選択肢がでなかったりで、不安があったため今回は利用していません

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

- インストール中にパッケージインストーラの選択肢がでてくるので、そこで`pip`または`uv`が選べます
  - 登場してまだ日が浅い`uv`ですが X(旧 Twitter)を見る限り評判もよく、私の体感としてもインストール処理が早く快適だったので、experimental とありますが採用しても良いのではと感じました
  - [Python 用の爆速パッケージマネージャー「uv」誕生！Rust 採用で 100 倍高速](https://roboin.io/article/2024/02/19/rust-based-python-package-manager-uv/)

```sh
? Select the preferred package installer ›
❯ pip-tools (slow but stable)
  uv (quick but experimental)
```

- インストール完了後にターミナルの結果に zsh が云々とかかれています
- zsh を使う場合はターミナルの案内通り`~/.zprofile`に下記を記載します
  - [Rye による Python 環境構築](https://kiririmode.hatenablog.jp/entry/20240105/1704466799)によると PATH を通しているとのこと

```sh
source "$HOME/.rye/env"
```

### Rye によるプロジェクトの作成

- 下記のコマンドを実行するとプロジェクトのディレクトリが作成されます

```sh
rye init rye-demo-project
```

![](https://i.imgur.com/FNSaLX0.jpeg)

- 次に利用する Python のバージョンを指定します

```sh
# Python 3.12.xを指定
rye pin 3.12
```

- 利用できる Python の一覧は以下で表示されます
- アーキテクチャ・cpython/pypy を選択できます
- 上記のように指定せずバージョンだけを記載する場合は、アーキテクチャは現在のマシンのもので、cpython が選ばれるということです
  - 参考: [Toolchain Management](https://rye-up.com/guide/toolchains/)

```sh
# 利用可能なバージョン一覧を表示する
rye toolchain list --include-downloadable

...
# python / Inter Mac向け
cpython-x86_64@3.12.2 (downloadable)
cpython-x86_64@3.12.1 (downloadable)
cpython-x86_64@3.12.0 (downloadable)
...
# python / MチップMac向け(今回はこれ)
cpython@3.12.1 (downloadable)
...
# pypy / Inter Mac向け
pypy-x86_64@3.10.13 (downloadable)
...
# pypy
pypy@3.10.13 (downloadable)
```

- このあと下記を実行するとプロジェクトの初期設定と、選択したバージョンの Python のダウンロードが行われます

```sh
rye sync
```

- また他の PC で環境構築する場合など、パッケージのバージョンを更新せずにインストールだけしたい場合は`--no-lock`のオプションが使えます

> https://rye-up.com/guide/sync/
> --no-lock
> To prevent the lock step from automatically running, pass --no-lock.

```python
rye sync --no-lock
```

- 必要なパッケージの追加/削除は以下の通り行います

```sh
# Seleniumをインストールする例
rye add selenium
```

```sh
# Seleniumをアンインストールする例
rye remove selenium
```

- その他バージョン指定など細かい話は、下記がまとまっていて分かりやすいと思います
  - [【Python のパッケージ管理に悩む方へ】パッケージ管理ツール Rye を使ってみた](https://dev.classmethod.jp/articles/get-start-rye-python/)

### パッケージの設定

- `pyproject.toml`のパッケージ設定は、poetry のときと比べて以下のようになります
- src 以下に他のパッケージがある場合は適宜追加して、パッケージ内で上位下位ディレクトリを意識せずモジュール間でアクセスできるようにしておきます
    - [Poetryでsys\.path\.appendを回避する
](https://zenn.dev/hpp/articles/6307447e5a037d)

```diff
# poetry
-[tool.poetry]
-packages = [{include = “src/rye-demo-project”}]

# rye
+[tool.hatch.build.targets.wheel]
+packages = ["src/rye-demo-project"]
```

- packagesで指定したパスは`PYTHONPATH`に追加されるよう
    - (`src`と`src/`で動作に違いがあったりするかも？)

```python
import sys
from pprint import pprint

pprint(sys.path)
```

## まとめ

- Rye を使って Python プロジェクトの管理を一括して行えるようになりました！
- 他にも色々ツールはありますが、現状 Rye が最も簡単に環境構築ができると思うので、興味がある方は導入してみると幸せになれるかもしれません
- 今後も新しいツールが出てくるかもしれませんが、しばらくは rye で戦っていけると思います。(願わくば rye がデファクトスタンダードになりますように…🙏)