Skip to content

Python のパッケージ管理を rye で行う

Python のパッケージ管理ツールは幾つかあります。 Armin Ronacher さんが開発した rye が使いやすかったのでインストールや基本的な利用手順をメモしておきます。 Armin Ronacher さんは rye の他に flask や jinja、click 等を開発されているそうです。 また、rye が初めて公開されたのは 2023 年 5 月だそうです。 今回は macOS 13.4.1 で検証しました。

余談

macOS であれば rye を homebrew からインストールすることも可能なようです。 但し、公式ページでは homebrew によるインストール手順をガイドしておらず、シェルスクリプトでのインストール手順がガイドされている為、今回は公式に従い後述の「シェルスクリプトによるインストール」を行います。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ brew info rye
==> rye: stable 0.11.0 (bottled)
Experimental Package Management Solution for Python
https://rye-up.com/
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/rye.rb
License: MIT
==> Dependencies
Build: rust ✘
==> Analytics
install: 140 (30 days), 586 (90 days), 586 (365 days)
install-on-request: 140 (30 days), 586 (90 days), 586 (365 days)
build-error: 2 (30 days)

インストール

rye のインストール手順は Installation に書かれています。 macOS の場合、下記を実行することで Intel / ARM アーキテクチャを見分け、適切なバイナリを自動的にインストールしてくれます。 尚、RYE_INSTALL_OPTION="--yes" オプションを指定しない場合はインストール前に「続行して良いか?」を対話的に確認される為、y を入力する必要があります。

1
curl -sSf https://rye-up.com/get | RYE_INSTALL_OPTION="--yes" bash

今回はバージョン 0.11 がインストールされました。

1
2
3
4
5
6
$ rye --version
rye 0.11.0
commit: 0.11.0 (f6f63d6c1 2023-07-18)
platform: macos (aarch64)
self-python: cpython@3.11
symlink support: true

rye のインストールが完了したらパスを追加しておきます。 bash 環境の場合、例えば以下のように設定を行い、シェルを再起動する等を行い、環境変数の変更を反映しておきます。

1
echo 'source "$HOME/.rye/env"' >> ~/.bash_profile

rye 自身のアップデート

rye 自身をアップデートするには rye self update を実行します。

1
rye self update

基本的な使い方

rye の基本的な利用方法は Basics に記載されています。

プロジェクトディレクトリの作成

rye を利用するにはまず、rye init 〜 を指定してプロジェクトディレクトリを作成します。 プロジェクトディレクトリを作成したら、そのままそのディレクトリへ移動します。

1
2
rye init my-project
cd my-project

参考までに、デフォルトでは以下のようなファイル / ディレクトリが自動作成されました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
my-project/
├── .git
│   ├── HEAD
│   ├── config
│   ├── description
│   ├── hooks
│   │   ├── applypatch-msg.sample
│   │   ├── commit-msg.sample
│   │   ├── fsmonitor-watchman.sample
│   │   ├── post-update.sample
│   │   ├── pre-applypatch.sample
│   │   ├── pre-commit.sample
│   │   ├── pre-merge-commit.sample
│   │   ├── pre-push.sample
│   │   ├── pre-rebase.sample
│   │   ├── pre-receive.sample
│   │   ├── prepare-commit-msg.sample
│   │   ├── push-to-checkout.sample
│   │   └── update.sample
│   ├── info
│   │   └── exclude
│   ├── objects
│   │   ├── info
│   │   └── pack
│   └── refs
│       ├── heads
│       └── tags
├── .gitignore
├── .python-version
├── README.md
├── pyproject.toml
└── src
    └── my_project
        └── __init__.py

Python のバージョン指定

このプロジェクトディレクトリで利用する Python のバージョンは rye pin [VERSION] で指定します。 実行例は以下の通りです。 指定したバージョンは .python-version ファイル中に定義されます。 後述しますが、この時点ではまだ Python 本体はインストール (ダウンロード) されません。

1
2
3
4
$ rye pin 3.10
pinned 3.10.11 in /Users/user/my-project/.python-version
$ cat .python-version
3.10.11

パッケージの追加

本番利用するパッケージは rye add [PACKAGE] で追加します。 追加されたパッケージは pyproject.toml ファイル中に定義されます。 以下は flask を追加する実行例です。 後述しますが、この時点ではまだパッケージはインストール (ダウンロード) されません。

1
2
$ rye add flask
Added flask>=2.3.2 as regular dependency

例えば black のように「本番環境では利用せず、開発環境でのみ利用する」パッケージは --dev を指定して追加します。 以下では black を追加する実行例です。 こちらも pyproject.toml ファイル中に定義されます。

1
2
$ rye add --dev black
Added black>=23.7.0 as dev dependency

Python 本体 / パッケージのインストール

指定した Python 本体やパッケージをインストール (ダウンロード) するには rye sync を実行します。 rye sync を実行することで自動的に仮想環境 (VirtualEnv) が作成され、指定したファイルが配置されます。

1
rye sync

rye run で Python のバージョンを確認してみると今回、指定した 3.10 系がインストールされていることが分かります。

1
2
$ rye run python --version
Python 3.10.11

パッケージのアンインストール

インストールしたパッケージをアンインストールするには rye remove [PACKAGE] を実行します。 これだけでは実際のアンインストールは行われず、その後に rye sync を実行して初めてパッケージがアンインストールされます。

1
2
rye remove flask
rye sync

rye 環境で実行する

rye で用意した環境内で Python を実行するには rye run 〜 を実行します。

1
2
3
4
$ rye run python hello.py
Initializing new virtualenv in /Users/user/Desktop/my-project/.venv
Python version: cpython@3.11.3
Hello, World!

但し、これでは同じスクリプトを何度も実行するのが面倒です。 このような場合は pyproject.toml ファイルの [tool.rye.scripts] セクションへ以下のように追記します (デフォルトではセクション自体が存在しないので、セクション自体を作成します)。 以下では「rye runhello を指定した際、python hello.py を実行する」という意味になります。

1
2
[tool.rye.scripts]
hello = "python hello.py"

実際に rye run hello を実行すると以下のように意図した実行結果になりました。

1
2
$ rye run hello
Hello, World!

pyproject.toml には様々な設定を行うことが出来、これらのオプションは Python Project にまとめられています。

グローバルにパッケージをインストールする

black のようなツールは「各プロジェクトごと」では無く、システム全体に一度だけインストールし、使い回す方が便利です。

1
rye install black

rye install [PACKAGE] によるシステム全体へのインストールはコマンド実行直後に行われます。 その為、rye sync 等を実行する必要はありません。 実際に black をシステム全体にインストールした場合、以下のパスにインストールされました。

1
2
$ which black
/Users/user/.rye/shims/black

システム全体にインストールした場合は (rye でインストールしたことを意識せず) そのままインストールしたツールを実行するだけです。

1
black

参考

rye init した際に自動作成されるファイルの中身は、今回の環境では以下のようになっていました。

.python-version

1
cpython@3.11.3

README.md

1
2
3
# my-project

Describe your project here.

pyproject.toml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
[project]
name = "my-project"
version = "0.1.0"
description = "Add your description here"
dependencies = []
readme = "README.md"
requires-python = ">= 3.8"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.rye]
managed = true
dev-dependencies = []

[tool.hatch.metadata]
allow-direct-references = true