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.txt
kojo-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という流行りは無理に乗らなくていいのでは)