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で登壇多数

../_images/uzabase-white-logo.png

nikkie(にっきー)と申します

Pythonは使いますか?

実務でも🙋‍♂️ 趣味でも🙋‍♀️

今日の話は Pythonのライブラリを管理 する話

  • どんなプログラミング言語でも、ライブラリを活用している

  • 今一番話したい技術の話:Pythonの依存ライブラリ管理の仕組みと状況🍜

  • 馴染みのある言語と比べて楽しんでいただければ

おことわり:nikkieのスタンス

  • 本トークは小言を言っているように聞こえるかも

  • 私はPythonが好き。手に馴染むし、これからも使い続けるだろうし、 改善提案もしていく

まずはタイトルの one obvious way

たったひとつのPythonらしいやり方

Python 30年以上の歴史

  • 生みの親、Guidoさん (1990年)

  • 2024年7月時点で最新は 3.12。10月に 3.13 が出ます

  • ここでは、Python 1 -> 2 へのバージョンアップの話

「ミニマリストの言語」だった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環境

  • 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チュートリアル などで紹介されており、膾炙しています

仮想環境のワークフロー

  1. 仮想環境を作る

  2. 仮想環境を有効にする

  3. 依存ライブラリをインストール

仮想環境の管理に使うツール

  1. 仮想環境を作る:venv(やvirtualenv)

  2. 仮想環境を有効にする:俺たち!

  3. 依存ライブラリをインストール:pip

Pythonチュートリアル に沿っています

仮想環境のワークフロー(コマンド)

$ python -m venv .venv --upgrade-deps  # 1
$ source .venv/bin/activate  # 2
(.venv) $ python -m pip install openai  # 3

仮想環境の再現(best effort

  1. インストールされたライブラリとバージョンを列挙したファイルを俺たちが作る(人力)

  2. 別の仮想環境で、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

人力のためにゆらぐ

俺たちは機能豊富ではない

  • 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

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はPythonの仮想環境に 提案 している

  • requirements.lock を自動管理

  • 開発者に触らせない

requirements.lock 自動管理

  • 人力で任意とはおさらば

  • 確実requirements.txt 相当ができ、そこに 全ての依存が記載 される

  • Ryeが仮想環境の状態を表すことで、再現しやすさにつながる

開発者に仮想環境を触らせない

  • Ryeが作った仮想環境には pipがない

  • (仮想環境管理ツール、俺たちで見たような)開発者が仮想環境に追加でインストールができない

  • 開発者が触れないことで、requirements.lock と一致を保てる

項目

Poetry

Rye

インストールにPythonが

必要

不要

Pythonを管理

しない

する

ライブラリ(仮想環境)管理

する

する

ロックファイル

独自仕様

pip freeze 相当

ℹ️拙ブログより Rye 🏃‍♂️

注目している依存ライブラリ管理ツール

  • Ryeは期待が過度にも見える

  • 私がいま注目しているのは Hatch

Hatch

  • Python実装だが、インストールに Python環境は不要 (インストーラあり)

  • Python処理系のバージョンを管理できる

  • 仮想環境も管理

Hatchを使ったプロジェクト

  • 依存ライブラリは pyproject.toml に書く(だけ)

  • (このファイルは PEP 518 で導入。普及してきた)

[project]
dependencies = ["kojo-fan-art"]

まるでCargoのよう

  • 記載した依存をインストールするためにコマンドを叩く必要はない

  • Hatchがインストールした仮想環境を用意 してくれる

Cargo.toml
[dependencies]

[dev-dependencies]
assert_cmd = "2"

項目

Rye

Hatch

インストールにPythonが

不要

どちらでも

Pythonを管理

する

する

ライブラリ(仮想環境)管理

する

する

ロックファイル

ばっちり

ゆるめ

ℹ️Hatchの参考情報 🏃‍♂️

スクリプト に限定した仮想環境

IMO:ちょっとした自動化のPythonスクリプトを書く場合、2024年時点ではRyeやHatchまで持ち出さなくてもよい

pipx (PEP 723 サポート)

スクリプトの先頭に 依存ライブラリを示すメタデータ を書く(だけ)

# /// script
# dependencies = ["openai"]
# ///

PEP 723 – Inline script metadata

pipx

まとめ:Pythonに依存ライブラリ管理ツールがたっくさんある話

  • Pythonではプロジェクトごとに仮想環境を用意する

  • Pythonでは 小さな機能を組合せられる ゆえに、たっくさんのツールが登場

  • Rust製のRyeからの学び。我が推しはHatch

項目

俺たち

Rye

Hatch

インストールにPythonが

必要(前提)

不要

どちらでも

Pythonを管理

しない

する

する

ライブラリ(仮想環境)管理

する(人力)

する

する

仮想環境の再現

手順が漏れうる

ばっちり

ゆるめ

One more thing

自作 しました

shirabe

% shirabe alpha .venv

項目

Hatch

shirabe

インストールにPythonが

どちらでも

必要

Pythonを管理

する

しない

ライブラリ(仮想環境)管理

する(意識しない)

する(意識させる)

仮想環境の再現

ゆるめ

ばっちり

ご清聴ありがとうございました

したっけね〜👋

【再掲】小言のように聞こえたかもしれませんが、Pythonという言語が好きなので、改善提案もしていきます(shirabe💪)

Appendix

本編に盛り込みきれなかった項目を

Pythonのスタンス

例え完璧を目指さなくても、アーリー・アダプターの人たちの目的を達成するのに、Pythonは「十分に良い」働きをしてきた。ユーザ基盤が成長してくるにつれて、ユーザから出される改善要望が徐々に言語に取り込まれてきた。

Python's Design Philosophy の日本語訳

依存ライブラリ管理についてnikkieの意見

  • スクリプトならば pipx (PEP 723サポートは快適すぎる!)

  • Pythonに慣れていなくてプロジェクト開発するならば、Pythonのバージョンや仮想環境がラップされるRye

  • Pythonで仮想環境管理した経験があってプロジェクト開発するならば、好きなのはHatchだが、Poetryでも なんでもいい と思う(Ryeという流行りは無理に乗らなくていいのでは)

Python自体の管理方法もさまざま

  • 本編で紹介:python.org からのインストール

  • 本編で紹介:RyeやHatchでもできる

  • python.org の他に使われてきたのは pyenv

  • 最近だと mise の体験がいいと聞く

EOF