Python のパッケージ管理を rye で行う
Python のパッケージ管理ツールは幾つかあります。 Armin Ronacher さんが開発した rye が使いやすかったのでインストールや基本的な利用手順をメモしておきます。 Armin Ronacher さんは rye の他に flask や jinja、click 等を開発されているそうです。 また、rye が初めて公開されたのは 2023 年 5 月だそうです。 今回は macOS 13.4.1 で検証しました。
余談¶
macOS であれば rye を homebrew からインストールすることも可能なようです。 但し、公式ページでは homebrew によるインストール手順をガイドしておらず、シェルスクリプトでのインストール手順がガイドされている為、今回は公式に従い後述の「シェルスクリプトによるインストール」を行います。
$ 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 を入力する必要があります。
今回はバージョン 0.11 がインストールされました。
$ 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 環境の場合、例えば以下のように設定を行い、シェルを再起動する等を行い、環境変数の変更を反映しておきます。
rye 自身のアップデート¶
rye 自身をアップデートするには rye self update を実行します。
基本的な使い方¶
rye の基本的な利用方法は Basics に記載されています。
プロジェクトディレクトリの作成¶
rye を利用するにはまず、rye init 〜 を指定してプロジェクトディレクトリを作成します。 プロジェクトディレクトリを作成したら、そのままそのディレクトリへ移動します。
参考までに、デフォルトでは以下のようなファイル / ディレクトリが自動作成されました。
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 本体はインストール (ダウンロード) されません。
$ 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 を追加する実行例です。 後述しますが、この時点ではまだパッケージはインストール (ダウンロード) されません。
例えば black のように「本番環境では利用せず、開発環境でのみ利用する」パッケージは --dev を指定して追加します。 以下では black を追加する実行例です。 こちらも pyproject.toml ファイル中に定義されます。
Python 本体 / パッケージのインストール¶
指定した Python 本体やパッケージをインストール (ダウンロード) するには rye sync を実行します。 rye sync を実行することで自動的に仮想環境 (VirtualEnv) が作成され、指定したファイルが配置されます。
rye run で Python のバージョンを確認してみると今回、指定した 3.10 系がインストールされていることが分かります。
パッケージのアンインストール¶
インストールしたパッケージをアンインストールするには rye remove [PACKAGE] を実行します。 これだけでは実際のアンインストールは行われず、その後に rye sync を実行して初めてパッケージがアンインストールされます。
rye 環境で実行する¶
rye で用意した環境内で Python を実行するには rye run 〜 を実行します。
$ 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 run で hello を指定した際、python hello.py を実行する」という意味になります。
実際に rye run hello を実行すると以下のように意図した実行結果になりました。
pyproject.toml には様々な設定を行うことが出来、これらのオプションは Python Project にまとめられています。
グローバルにパッケージをインストールする¶
black のようなツールは「各プロジェクトごと」では無く、システム全体に一度だけインストールし、使い回す方が便利です。
rye install [PACKAGE] によるシステム全体へのインストールはコマンド実行直後に行われます。 その為、rye sync 等を実行する必要はありません。 実際に black をシステム全体にインストールした場合、以下のパスにインストールされました。
システム全体にインストールした場合は (rye でインストールしたことを意識せず) そのままインストールしたツールを実行するだけです。
参考¶
rye init した際に自動作成されるファイルの中身は、今回の環境では以下のようになっていました。
.python-version¶
README.md¶
pyproject.toml¶
[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