one obvious wayを志向するPythonに依存ライブラリ管理ツールがたっくさんある話
one obvious wayを志向するPythonに依存ライブラリ管理ツールがたっくさんある話
〜Rust製ツールが高速を謳う〜
- Event:
- TechRAMEN 2024 Conference 前夜祭 
- Presented:
- 2024/07/26 nikkie 
nikkie(にっきー)と申します
- 東京から来ました。初旭川 
- ソフトウェアエンジニアリングで突破するデータサイエンティスト(We're hiring!) 
- Python歴6年。PyConで登壇多数 
 
nikkie(にっきー)と申します
- ブログ 連続610日突破 
Pythonは使いますか?
実務でも🙋♂️ 趣味でも🙋♀️
今日の話は Pythonのライブラリを管理 する話
- どんなプログラミング言語でも、ライブラリを活用している 
- 今一番話したい技術の話:Pythonの依存ライブラリ管理の仕組みと状況🍜 
- 馴染みのある言語と比べて楽しんでいただければ 
おことわり:nikkieのスタンス
- 本トークは小言を言っているように聞こえるかも 
- 私はPythonが好き。手に馴染むし、これからも使い続けるだろうし、 改善提案もしていく 
まずはタイトルの one obvious way
たったひとつのPythonらしいやり方
Python 30年以上の歴史
「ミニマリストの言語」だったPython 1
- Python 2.0以降、「Pythonが野放図に拡張されて、Perlと区別がつかなくなってしまう?」という声 
- Tim Petersは、Pythonを開発する人向けに「The Zen of Python」(1999年)を書いて回答 
- そこに one obvious way 
There should be one-- and preferably only one --obvious way to do it.
python -m this
Pythonを野放図に拡張するわけではない
- Perlのモットー "There's More Than One Way To Do It." (やり方はひとつじゃない) 
- Pythonは "There's Only One Way To Do It." (たった一つのやり方) 
- 参照 The Zen of Python 解題 - 後編 (石本さん) 
😈え? one obvious wayを志向するPythonに依存ライブラリ管理ツールがたっくさんあるんですか?
- 😇はい!(ノーダメージ) 
- one obvious wayは Python自体 の話(Python 2.0時点) 
- IMO:パッケージマネージャは言語機能ではないので、たくさんあっても 言語哲学的にはOK (ユーザとしては?) 
ℹ️参考情報 🏃♂️
- 『パーフェクトPython[改訂2版]』「1-4 Pythonの禅」 
Python環境
- Pythonのバージョンと依存ライブラリのバージョンは 分けて管理 
- pip(サードパーティのライブラリ管理ツール)が使えるが、python -m pip install としては い け ま せ ん
仮想環境
Python環境はおもちですか? / Is your Python environment a rice cake?
ディレクトリ!
- 仮想環境とは、ディレクトリのこと 
- そこに依存ライブラリを配置する 
- Pythonで開発する場合、 まずディレクトリ(仮想環境)を用意する 
他の言語ではツールが自動で配置ディレクトリを作る
- pnpm ( - node_modules)
- composer ( - vendor)
Pythonでは作っているか 意識 する必要あり
Pythonで依存ライブラリが置かれる場所
- site-packages というディレクトリ 
- PyPI (など)からライブラリをダウンロードして配置 
- Python処理系の持つ - site-packagesは1箇所だけ(👉バージョン違いは上書きし合う😱)
仮想環境で プロジェクトごとのsite-packages を用意✅
- 仮想環境(ディレクトリ)には - site-packagesディレクトリも含む
- プロジェクトに必要な依存を仮想環境の - site-packagesに置くように運用
- 1台のマシンに、同じライブラリの バージョン違いを共存 させられる 
仮想環境を作るツール
- 標準ライブラリの venv 
- サードパーティの virtualenv 
- virtualenvが先にあり、人気を受けて標準に入った(PEP 405) 
仮想環境はこんなディレクトリ
.venv/
├── bin/
│   ├── activate
│   ├── pip
│   ├── pip3
│   ├── pip3.12
│   ├── python -> python3.12
│   ├── python3 -> python3.12
│   └── python3.12 -> /Library/Frameworks/Python.framework/Versions/3.12/bin/python3.12
├── lib/
│   └── python3.12/  # <- この下に site-packages
└── pyvenv.cfg
仮想環境管理ツール、俺たち 😎
- Pythonにおいて、仮想環境を扱う方法(の1つ)は 人力 頼みです 
- Pythonチュートリアル などで紹介されており、膾炙しています 
仮想環境のワークフロー
- 仮想環境を作る 
- 仮想環境を有効にする 
- 依存ライブラリをインストール 
仮想環境の管理に使うツール
- 仮想環境を作る:venv(やvirtualenv) 
- 仮想環境を有効にする:俺たち! 
- 依存ライブラリをインストール:pip 
Pythonチュートリアル に沿っています
仮想環境のワークフロー(コマンド)
$ python -m venv .venv --upgrade-deps  # 1
$ source .venv/bin/activate  # 2
(.venv) $ python -m pip install openai  # 3仮想環境の再現(best effort)
- インストールされたライブラリとバージョンを列挙したファイルを俺たちが作る(人力) 
- 別の仮想環境で、1のファイルを元にインストール 
ライブラリとバージョンを列挙したファイル
(.venv) $ python -m pip freeze > requirements.txtkojo-fan-art==0.1.1ファイルを元にした仮想環境の再現
$ python -m venv .venv2 --upgrade-deps
$ source .venv2/bin/activate
(.venv2) $ python -m pip install -r requirements.txt人力のためにゆらぐ
- requirements.txtという名前の揺れ(拙ブログ:Python使いはpip freezeの出力を常にrequirements.txtというファイルに保存する?)
- pip freeze の出力を含まない - requirements.txt(全ての依存がない!)
俺たちは機能豊富ではない
- Python開発者がvenvやpipを操作する場合、順風満帆ではない😫 
- ツラかった例: いくつかをアンインストールし 、 - requirements.txtも更新
- pipはインストールできたバージョンを書き出す(多くのツールは 逆 では?) 
でも 小さい部品を組合せ てるんだ!
- venvやpipなど、機能ごとに小さなモジュール 
- 組合せて依存ライブラリ管理をする 
- ここまでは、人間がvenvとpipを組合せ た例 
シンプル(≒レゴブロック)
組み合わせる提案いくつも
- Pythonに依存ライブラリ管理ツールがたっくさんあるのは、小さな部品を組合せられる から 
- 各自が感じる課題を解消する組合せ方のたっくさんの提案(楽してこーぜ) 
- Poetry, Pipenv, PDM, Flit, ... (この後にも登場します) 
例:Poetry
仮想環境管理ツール 俺たち のペインを解消
Poetryはこんなツール
- インストールにPython環境が必要 
- 仮想環境の管理 を担ってくれる 
- ライブラリの公開など多岐にサポート 
Poetryを使ったプロジェクト
- 依存ライブラリの追加は poetry add 
- Poetryはプロジェクトごとに仮想環境を管理(開発者は意識しない) 
- Poetryが - poetry.lockも管理(- requirements.txtと異なり独自仕様)
Poetryを使ったプロジェクトの再現
- poetry install (以上!) 
- poetry.lockに沿って仮想環境を再現
小まとめ🥟:仮想環境
- プロジェクトごとにライブラリをインストールするための仕組み 
- 仮想環境管理の代表的な方法は、 人力 
- 人力に代わる仮想環境管理ツールがいくつも提案されている 
| 項目 | 俺たち | Poetry | 
|---|---|---|
| Pythonのバージョン | 管理しない | 管理しない | 
| ライブラリのバージョン | 仮想環境にインストールして管理 | 管理(仮想環境を意識させない) | 
| 仮想環境の再現 | 手順が漏れうる | 完全サポート | 
ℹ️拙ブログより 仮想環境 🏃♂️
Rust 製ツールが高速を謳う
BREAKING NEWS!! Rustで実装した仮想環境管理ツールが登場
Rust製ツール
- Rye:
- ライブラリだけでなくPythonもバージョン管理できる。注目&期待されている 
- uv:
- Rustで実装したpip(Ryeも使用) 
Ryeはこんなツール
- インストールに Python環境は不要 (rustup のよう) 
- RyeはPython処理系のバージョンを管理できる 
- 仮想環境も管理 
Ryeを使ったプロジェクト
- 依存ライブラリの追加は rye add 
- RyeがPythonのバージョンや仮想環境も管理(Ryeしか意識しない) 
- さらに - requirements.lockも管理
Ryeを使ったプロジェクトの再現
- rye sync (以上!) 
- Pythonのバージョンや、仮想環境が再現される 
RyeはPythonの仮想環境に 提案 している
- requirements.lockを自動管理
- 開発者に触らせない 
requirements.lock 自動管理
- 人力で任意とはおさらば 
- 確実 に - requirements.txt相当ができ、そこに 全ての依存が記載 される
- Ryeが仮想環境の状態を表すことで、再現しやすさにつながる 
開発者に仮想環境を触らせない
- Ryeが作った仮想環境には pipがない 
- (仮想環境管理ツール、俺たちで見たような)開発者が仮想環境に追加でインストールができない 
- 開発者が触れないことで、 - requirements.lockと一致を保てる
| 項目 | Poetry | Rye | 
|---|---|---|
| インストールにPythonが | 必要 | 不要 | 
| Pythonを管理 | しない | する | 
| ライブラリ(仮想環境)管理 | する | する | 
| ロックファイル | 独自仕様 | 
 | 
ℹ️拙ブログより Rye 🏃♂️
- pipのない仮想環境にもかかわらず、Ryeがpip-syncできる"魔法"を理解する - この方法を使えば、開発者もRyeの仮想環境にインストールできちゃいます 
 
注目している依存ライブラリ管理ツール
- Ryeは期待が過度にも見える 
- 私がいま注目しているのは Hatch 
Hatch
- Python実装だが、インストールに Python環境は不要 (インストーラあり) 
- Python処理系のバージョンを管理できる 
- 仮想環境も管理 
Hatchを使ったプロジェクト
- 依存ライブラリは - pyproject.tomlに書く(だけ)
- (このファイルは PEP 518 で導入。普及してきた) 
[project]
dependencies = ["kojo-fan-art"]まるでCargoのよう
- 記載した依存をインストールするためにコマンドを叩く必要はない 
- Hatchがインストールした仮想環境を用意 してくれる 
[dependencies]
[dev-dependencies]
assert_cmd = "2"| 項目 | Rye | Hatch | 
|---|---|---|
| インストールにPythonが | 不要 | どちらでも | 
| Pythonを管理 | する | する | 
| ライブラリ(仮想環境)管理 | する | する | 
| ロックファイル | ばっちり | ゆるめ | 
ℹ️Hatchの参考情報 🏃♂️
- Python Monthly Topics 最近気になるツール「Hatch」でPythonプロジェクトを管理する 
スクリプト に限定した仮想環境
IMO:ちょっとした自動化のPythonスクリプトを書く場合、2024年時点ではRyeやHatchまで持ち出さなくてもよい
pipx (PEP 723 サポート)
スクリプトの先頭に 依存ライブラリを示すメタデータ を書く(だけ)
# /// script
# dependencies = ["openai"]
# ///pipx
- PEP 723サポート= スクリプトに必要な依存を含む仮想環境をpipxが管理 (開発者を解放🙌) 
- 詳しくはこちらをどうぞ:Pythonスクリプトのモジュラリティとポータビリティを高めていく 
まとめ:Pythonに依存ライブラリ管理ツールがたっくさんある話
- Pythonではプロジェクトごとに仮想環境を用意する 
- Pythonでは 小さな機能を組合せられる ゆえに、たっくさんのツールが登場 
- Rust製のRyeからの学び。我が推しはHatch 
| 項目 | 俺たち | Rye | Hatch | 
|---|---|---|---|
| インストールにPythonが | 必要(前提) | 不要 | どちらでも | 
| Pythonを管理 | しない | する | する | 
| ライブラリ(仮想環境)管理 | する(人力) | する | する | 
| 仮想環境の再現 | 手順が漏れうる | ばっちり | ゆるめ | 
One more thing
自作 しました
shirabe
% shirabe alpha .venv- requirements.txt込みで仮想環境を作る
| 項目 | Hatch | shirabe | 
|---|---|---|
| インストールにPythonが | どちらでも | 必要 | 
| Pythonを管理 | する | しない | 
| ライブラリ(仮想環境)管理 | する(意識しない) | する(意識させる) | 
| 仮想環境の再現 | ゆるめ | ばっちり | 
ご清聴ありがとうございました
したっけね〜👋
【再掲】小言のように聞こえたかもしれませんが、Pythonという言語が好きなので、改善提案もしていきます(shirabe💪)
Appendix
本編に盛り込みきれなかった項目を
Pythonのスタンス
例え完璧を目指さなくても、アーリー・アダプターの人たちの目的を達成するのに、Pythonは「十分に良い」働きをしてきた。ユーザ基盤が成長してくるにつれて、ユーザから出される改善要望が徐々に言語に取り込まれてきた。
依存ライブラリ管理についてnikkieの意見
- スクリプトならば pipx (PEP 723サポートは快適すぎる!) 
- Pythonに慣れていなくてプロジェクト開発するならば、Pythonのバージョンや仮想環境がラップされるRye 
- Pythonで仮想環境管理した経験があってプロジェクト開発するならば、好きなのはHatchだが、Poetryでも なんでもいい と思う(Ryeという流行りは無理に乗らなくていいのでは)