Slide 1

Slide 1 text

setuptools の最近 PyCon JP 2022 Atsushi Odagiri 2022-10-14 Atsushi Odagiri setuptools の最近 2022-10-14 1 / 34

Slide 2

Slide 2 text

Outline 1 はじめに 2 今日の setuptools 3 setuptools とは? 4 Good-bye distutils! 5 setuptools の近代化 6 setuptools が失ったもの 7 おわり Atsushi Odagiri setuptools の最近 2022-10-14 2 / 34

Slide 3

Slide 3 text

お前誰よ Atsushi Odagiri Open Collector Python は 1.5 くらいのころから Atsushi Odagiri setuptools の最近 2022-10-14 3 / 34

Slide 4

Slide 4 text

setuptools と私 2013 1.1.5 パッケージングの今と未来 2014 6.0 パッケージングの今 2014 6.0 2015 18.3 Packaging 最前線 2016 27.3.0 パッケージングを支える技術 2017 36.4.0 Python とパッケージングと私 2018 40.2.0 あなたと Python 今すぐパッケージング 2019 41.2.0 LT 今日の setuptools 2021 53.0.0 charity talk パッケージングの呼び声 Atsushi Odagiri setuptools の最近 2022-10-14 4 / 34

Slide 5

Slide 5 text

今日の setuptools 2022 65.4.1 NEW! setuptools の最近 Atsushi Odagiri setuptools の最近 2022-10-14 5 / 34

Slide 6

Slide 6 text

setuptools とは? distutils を拡張するもの 所謂 setup.py を作成するために使う (使われた) Atsushi Odagiri setuptools の最近 2022-10-14 6 / 34

Slide 7

Slide 7 text

setuptools の最近 近代化:パッケージング関連 PEP への追従 distutils が標準ライブラリから消える予定 いろいろ剥ぎ取られて純粋なパッケージ作成ツールになってきている Atsushi Odagiri setuptools の最近 2022-10-14 7 / 34

Slide 8

Slide 8 text

distutils の行く末 PEP 632 – Deprecate distutils module 3.12 で削除 (多分) https://github.com/python/cpython/tree/main/Lib/distutils まだある. . . Atsushi Odagiri setuptools の最近 2022-10-14 8 / 34

Slide 9

Slide 9 text

distutils はどこにある? 標準ライブラリ setuptools の中 (setuptools/_distutils) SETUPTOOLS_USE_DISTUTILS "stdlib" 標準ライブラリにある distutils を使う "local" setuptools 内部で持っている distutils を使う distutils-precedence.pth の中で切り替え Atsushi Odagiri setuptools の最近 2022-10-14 9 / 34

Slide 10

Slide 10 text

pth ファイル site-packages に置いてある *.pth ./ などで始まる行は sys.path に追加 それ以外の行は python コードとして 実行される 回避不能 python2 のころは -S オプションで回避できてたかも -S Disable the import of the module site and the site-dependent manipulations of sys.path that it entails. Atsushi Odagiri setuptools の最近 2022-10-14 10 / 34

Slide 11

Slide 11 text

Good bye setup.py? setup.py お前、消えるのか? Atsushi Odagiri setuptools の最近 2022-10-14 11 / 34

Slide 12

Slide 12 text

setuptools の近代化 PEP への追従 setup が持っていた機能は別のツールへ 純粋にパッケージ作成のツール Atsushi Odagiri setuptools の最近 2022-10-14 12 / 34

Slide 13

Slide 13 text

PEP への追従 PEP 517 setup.py が不要に! (でも editable するときは必要) PEP 621 setup.cfg が不要に! (でも editable するときは必要) PEP 660 pyproject.toml だけで editable 可能に! Atsushi Odagiri setuptools の最近 2022-10-14 13 / 34

Slide 14

Slide 14 text

setup.py の役割 パッケージメタデータを書く パッケージングする Atsushi Odagiri setuptools の最近 2022-10-14 14 / 34

Slide 15

Slide 15 text

setup.py でパッケージングする $ python setup.py sdist bdist_wheel $ python setup.py upload Atsushi Odagiri setuptools の最近 2022-10-14 15 / 34

Slide 16

Slide 16 text

setup.cfg にメタデータを書く setup 関数の引数として書いていたが setup.cfg にも書ける setup.py の中身は引数なしの setup() だけに Atsushi Odagiri setuptools の最近 2022-10-14 16 / 34

Slide 17

Slide 17 text

PEP517 sdist から wheel を作る方法の定義 パッケージングツールは wheel 作成の API を提供する パッケージング設定は pyproject.toml に書く 設定ファイル増えたよ!? [build-system] requires = ["setuptools"] build-backend = "setuptools.build_meta" Atsushi Odagiri setuptools の最近 2022-10-14 17 / 34

Slide 18

Slide 18 text

PEP621 pyproject.toml にメタデータを書くためのスキーマ定義 v61.0.0 (24 Mar 2022) で導入 Atsushi Odagiri setuptools の最近 2022-10-14 18 / 34

Slide 19

Slide 19 text

パッケージメタデータ(オールドスタイル) setup.py setup( name="very-useful-tool", version="0.1", author="Atsushi Odagiri", ... install_requires=[ "pyramid", ], tests_require=[ "pytest", ], ... ) Atsushi Odagiri setuptools の最近 2022-10-14 19 / 34

Slide 20

Slide 20 text

パッケージメタデータ(セミオールドスタイル) setup.cfg [metadata] name = very-useful-tool version = 0.1 author Atsushi Odagiri ... [options] install_requires = pyramid tests_require = pytest Atsushi Odagiri setuptools の最近 2022-10-14 20 / 34

Slide 21

Slide 21 text

パッケージメタデータ(PEP621) pyproject.toml [project] name="very-useful-tool" version="0.1" author="Atsushi Odagiri" dependencies = ["pyramid"] [project.optional-dependencies] tests = ["pytest"] Atsushi Odagiri setuptools の最近 2022-10-14 21 / 34

Slide 22

Slide 22 text

setup.py は不要になるか PEP 517 対応 setup.py なしでもパッケージング作業は可能 PEP 621 対応 メタデータの記述が setup.cfg から pyproject.toml に移動 editable インストールするときはまだ必要 空の setup.cfg を作るはめに. . . PEP 660 で editable インストールのための API が提案された poetry や flit は対応済 setuptools は作業中 Atsushi Odagiri setuptools の最近 2022-10-14 22 / 34

Slide 23

Slide 23 text

setuptools が失ったもの パッケージインストーラー (easy_install) パッケージのマルチバージョニング (egg ディレクトリ) ディストリビューションフォーマット (egg フォーマット) パッケージメタデータの拡張 (egg_info) パッケージ関連のライブラリ (pkg_resources) PyPI へのアップロード (setup.py upload) Atsushi Odagiri setuptools の最近 2022-10-14 23 / 34

Slide 24

Slide 24 text

インストーラーは easy_install から pip へ PEP 453 – Explicit bootstrapping of pip in Python installations python インストールと同時に pip もインストールされるようになった easy_install と pip PyPI からダウンロードしてインストール 対象ライブラリが依存するライブラリもインストールする easy_install の弱点 atomic 性の欠如 複数パッケージインストール中にエラーが発生すると中途半端な状態に egg ディレクトリへのインストール Atsushi Odagiri setuptools の最近 2022-10-14 24 / 34

Slide 25

Slide 25 text

インストール先は egg ディレクトリから venv へ PEP 405 – Python Virtual Environments site-packages 以下にディストリビューションごとのディレクトリ ( = egg ディレクトリ) を作成してその下に展開 例えば site-packages/pyramid-1.4-egg/pyramid/ pth ファイルを使って sys.path に追加 egg zip safe egg ディレクトリと同じ構造で zip 化した状態 zip_safe=True なら egg ファイルのまま site-packages にコピー Atsushi Odagiri setuptools の最近 2022-10-14 25 / 34

Slide 26

Slide 26 text

egg ディレクトリで multi versioning してたのに! easy_install -m で multi versioning 対象に pth ファイルから対象の egg ディレクトリを削除 このままでは sys.path に追加されなくなる setuptools.Require で特定バージョンを有効化 venv で分離すればいいよね Atsushi Odagiri setuptools の最近 2022-10-14 26 / 34

Slide 27

Slide 27 text

バイナリディストリビューションは egg から wheel へ PEP 427 – The Wheel Binary Package Format 1.0 PEP 491 – The Wheel Binary Package Format 1.9 PEP 425 – Compatibility Tags for Built Distributions PEP 513 – A Platform Tag for Portable Linux Built Distributions PEP 571 – The manylinux2010 Platform Tag PEP 599 – The manylinux2014 Platform Tag PEP 600 – Future ‘manylinux’ Platform Tags for Portable Linux Built Distributions wheel/egg2wheel Atsushi Odagiri setuptools の最近 2022-10-14 27 / 34

Slide 28

Slide 28 text

egg_info から dist_info に! PEP 241 – Metadata for Python Software Packages PEP 314 – Metadata for Python Software Packages v1.1 PEP 345 – Metadata for Python Software Packages 1.2 PEP 566 – Metadata for Python Software Packages 2.1 description-content-type PEP 643 – Metadata for Package Source Distributions 2.3 PEP 685 – Comparison of extra names for optional distribution dependencies PEP 508 – Dependency specification for Python Software Packages PEP 386 – Changing the version comparison module in Distutils PEP 376 – Database of Installed Python Distributions Atsushi Odagiri setuptools の最近 2022-10-14 28 / 34

Slide 29

Slide 29 text

pkg_resources とその後継 distlib packaging pkg_resources の機能が標準ライブラリへ importlib.metadata importlib.resource Atsushi Odagiri setuptools の最近 2022-10-14 29 / 34

Slide 30

Slide 30 text

インストールされているパッケージ一覧を表示する (freeze) 例 pkg_resources の例 import site import pkg_resources pkg_resources.find_distributions( site.getsitepackages()[0]) distlib の例 from distlib.database import DistributionPath dist_path = DistributionPath() [d.name for d in dist_path.get_distributions()] importlib.metadata の例 from importlib import metadata [d.name for d in metadata.distributions()] Atsushi Odagiri setuptools の最近 2022-10-14 30 / 34

Slide 31

Slide 31 text

PyPI へのアップロードフロー wheel 作成は build を使う PyPI へのアップロードは twine を使う $ python setup.py register sdist upload $ python -m build . $ python -m twine upload dist/*.whl Atsushi Odagiri setuptools の最近 2022-10-14 31 / 34

Slide 32

Slide 32 text

まとめ distutils が標準ライブラリから消えるので setuptools に同梱 ハックがひどい setuptools の近代化 PEP 517 setup.py が不要に! (でも editable するときは必要) PEP 621 setup.cfg が不要に! (でも editable するときは必要) PEP 660 pyproject.toml だけで editable 可能に! setuptools が失ってきたもの インストーラー egg pkg_resources などなど Atsushi Odagiri setuptools の最近 2022-10-14 32 / 34

Slide 33

Slide 33 text

参考 (1) PEPs https://peps.python.org/topic/packaging/ PEP 405 – Python Virtual Environments PEP 420 – Implicit Namespace Packages PEP 425 – Compatibility Tags for Built Distributions PEP 440 – Version Identification and Dependency Specification PEP 453 – Explicit bootstrapping of pip in Python installations PEP 491 – The Wheel Binary Package Format 1.9 PEP 513 – A Platform Tag for Portable Linux Built Distributions PEP 517 – A build-system independent format for source trees PEP 571 – The manylinux2010 Platform Tag Atsushi Odagiri setuptools の最近 2022-10-14 33 / 34

Slide 34

Slide 34 text

参考 (2) PEPs PEP 599 – The manylinux2014 Platform Tag PEP 600 – Future ‘manylinux’ Platform Tags for Portable Linux Built Distributions PEP 621 – Storing project metadata in pyproject.toml PEP 632 – Deprecate distutils module PEP 660 – Editable installs for pyproject.toml based builds (wheel based) The Python Standard Library pkgutil importlib importlib.metadata setuptools documentation, https://setuptools.pypa.io/en/latest/ Python Packaging User Guide, https://packaging.python.org/en/latest/ setuptools - The Peak Developer’s Center, http://peak.telecommunity.com/DevCenter/setuptools Atsushi Odagiri setuptools の最近 2022-10-14 34 / 34