SlideShare a Scribd company logo
パッケージングしよう
Start Python Club みんなの Python 勉強会#77
Atsushi Odagiri
2022-01-27
はじめに
お前誰よ
▶ aodag
▶ Atsushi Odagiri
▶ 株式会社オープンコレクター
▶ python1.5 とかから
アジェンダ
▶ Python パッケージングのエコシステム
▶ パッケージングして配布する
Python パッケージングのエコシステム
PyPA
▶ Python Packaging Authority
▶ パッケージング関連の PEP(Python Enhancement Proposal)
を提案
▶ パッケージング関連ツールの保守
PyPA が提供するツール
▶ pip
▶ setuptools
▶ wheel
▶ twine
▶ build, pep517.build
▶ PyPI(warehouse)
PyPA が提供するツール
配布物の形式
▶ ソースディストリビューション (sdist)
▶ tar ball
▶ zip
▶ バイナリディストリビューション (bdist)
▶ wheel
sdist
▶ ソースコードやドキュメントやメタデータファイルなどその
まま含まれる
▶ ビルド前の外部言語によるソース
▶ wheel を作成するための情報
▶ インストールされないドキュメントなどの情報
▶ テストコード
bdist
▶ 今は wheel のことだけ考えといてください
▶ そのまま zip 解凍などで展開するだけの状態
▶ インストールされるファイルだけが入っている
pip インストーラー
▶ PyPI や find-links から配布物 (sdist や bdist) をダウンロードし
てインストール
$ python get-pip.py
$ pip install pyramid
pip がどこにインストールするか
▶ pip の場所を pip --version で確認
▶ pip が入っている site-packages ディレクトリにインストー
ルされるはずです
▶ python で site.getsitepackages() も確認
▶ pip が入っている site-packages ディレクトリが含まれてい
ることを確認しましょう
$ pip --version
pip 21.3.1 from /home/aodag/works/.venv/lib/python3.9/site-
packages/pip (python 3.9)
$ python -c "import site;print(site.getsitepackages())"
['/home/aodag/works/.venv/lib/python3.9/site-packages', '/h
packages', '/home/aodag/works/.venv/lib/python3/dist-
packages', '/home/aodag/works/.venv/lib/python3.9/dist-
packages']
setuptools, wheel パッケージャー
▶ 配布物を作成する
▶ PEP517 に対応しているため build で配布物を作成可能
▶ PEP517 対応 (pyproject.toml) については後述
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
build, pep517.build ビルダー
▶ 配布物を作成する
▶ プロジェクトごとに異なる作成方法に対応する
▶ pyproject.toml に書かれているツールを呼び出す
$ pip install build
$ python -m build .
twine アップローダー
▶ PyPI に配布物をアップロードする
▶ アップロード前のチェックや PyPI へのプロジェクト登録な
どもこれで
$ pip install twine
$ twine check `dist/*`
$ twine register `dist/*.whl`
$ twine upload `dist/*`
PyPI パッケージインデックス
▶ Python Package Index
▶ 配布物のインデックスや配布物自体をホスティング
▶ 昔はインデックスだけで別途ホスティングしてある配布物の
ダウンロードリンクを登録していた
▶ https://pypi.python.org
パッケージングして配布する
配布物を作る(パッケージング)
▶ メタデータが必要
▶ sdist と bdist(wheel) の両方を PyPI に上げてくれるとユー
ザーはうれしい
▶ C 拡張を含む話はしません
ファイル
▶ 実際に配布したい Python モジュール以外に必要なファイル
▶ setup.py
▶ setup.cfg
▶ pyproject.toml
▶ MANIFEST.in
▶ README.{md,rst}
▶ LICENSE
setup.py
▶ 昔はここにメタデータを含めて必要なことを全部書いていた
▶ もうこれで十分
from setuptools import setup
setup()
setup.cfg metadata
▶ パッケージメタデータを書く
[metadata]
name = aodag_super_util
version = 0.1
author = Atsushi Odagiri
author_email = aodagx@gmail.com
url = https://git.example.com/aodag/super_util
license = MIT
description = file: README.md
description-content-type = text/markdown
setup.cfg options
▶ 配布物のオプションを書く
▶ 主に依存関係
[options]
packages = find:
install_requires =
pyramid
pyramid_jinja2
setup.cfg extras_require
▶ 追加の依存関係
[options.extras_require]
testing =
pytest
pytest-randomly
doc =
sphinx
setup.cfg find
▶ インストール対象のモジュールに関する情報
▶ ここでの package とは Python モジュールをまとめた
__init__.py を持つディレクトリのほう
[options.packages.find]
exclude =
tests
examples
依存関係
install_requires
▶ 依存ライブラリを書く
▶ バージョンを直接指定しないように
▶ 最低限必要なバージョンなどの範囲指定に留めましょう
extras_require
▶ 追加機能としての依存ライブラリを書く
▶ デフォルトとしてインストールされない
▶ 開発時に利用する依存ライブラリもここに書いちゃう
pyproject.toml
▶ PEP517 のビルドフローで setuptools を利用するための設定
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
MANIFEST.in
▶ sdist に含めたい (含めたくない) ファイルを設定
recursive-include aodag/specialutils/templates *.html
exclude *.swp *~
MANIFEST.in のオプション
▶ 主なものだけ distutils から抜粋
Command Description
include pat1 pat2 … マッチするファイルを全部含める
exclude pat1 pat2 … マッチするファイルを全部除外する
recursive-include
dir pat1 pat2 …
指定ディレクトリ以下のマッチする
ファイルを再帰的に含める
recursive-exclude
dir pat1 pat2 …
指定ディレクトリ以下のマッチする
ファイルを再帰的に除外する
README を setup.cfg に活かす
▶ README{.md,.rst} の内容をメタデータの description に使う
[metadata]
...
description = file: README.md
description_content_type = text/markdown
README{.md,.rst}
▶ markdown か reStructured text か?
▶ デフォルトは reStructured text
▶ PEP 566 でフォーマットを指定できるようになった
▶ PyPI では markdown を利用できるようになった
▶ お好きな方でどうぞ
LICENSE
▶ 必ずつけましょう
▶ メタデータにも書いておきましょう
▶ ライセンスごとの identifier は spdx を参照してください
[metadata]
...
license = MIT
どうしてこんなにファイルが必要?
▶ 歴史的経緯 です><
▶ distutils から setuptools 導入当初 setup.py に全部書く
▶ setuptools の改善 メタデータは setup.cfg に書く
▶ PEP517 対応 pyproject.toml に build 設定を書く
もういらない?
▶ setup.py
▶ editable インストールに必要
▶ PEP660 で解決される予定
▶ setup.cfg
▶ パッケージメタデータを書くのに必要
▶ PEP621, PEP631 で解決される予定
▶ MANIFEST.in
▶ setuptools_scm を使うことで不要になる
▶ バージョン管理下のファイルは全部 sdist に入れてしまえ
setuptools_scm
▶ scm(git など) で管理しているファイルを sdist に含めるよう
になる
▶ scm(git など) のタグやリビジョンを元に version を生成して
くれる
# pyproject.toml
[build-system]
requires = ["setuptools>=45", "wheel", "setuptools_scm>=6.2
[tool.setuptools_scm]
package data
▶ こういうソースコード以外のファイルもありますよね?
▶ HTML テンプレート
▶ サンプルデータやシード
▶ setuptools_scm を使わない場合、MANIFEST.in に書かないと
sdist に入らないので結果的にインストールされません
▶ 2箇所あるので気をつけましょう
▶ MANIFEST.in で sdist に含める
▶ setup.cfg で options.include_package_data を True にする
[options]
include_package_data = True
package data を参照する方法
▶ pkg_resource を使う
▶ pkg_resources は setuptools に含まれることに注意
▶ __file__ からファイルパスを導出する
package data を pkg_resources で読み込む
▶ pkg_resources の resource_string や resource_stream
を使って読み込む
▶ pkg_resources は setuptools に含まれるモジュールであ
ることに注意
▶ 依存関係に setuptools を含めることになります
import pkg_resources
hello_html = pkg_resources.resource_string(__name__, "templ
package data を __file__ を使って読み込む
▶ __file__ を使うなら標準モジュールのみで実現できます
▶ pathlib を使うのも良いでしょう
here = os.path.dirname(__file__)
with open(os.path.join(here, "templates", "hello.html")) as
hello_html = f.read()
editable インストール
▶ 開発対象のソースコードが site-packages にコピーされな
いようにします
▶ 開発中は editable install で依存ライブラリをインストールで
きます
$ pip install -e .
$ pip freeze
配布物を作る前に
▶ テストはしておきましょう
▶ テスト用の依存関係は testing などの名前で extras-require に
しておくと楽です
▶ 様々な python バージョンに対してテストする場合は tox や
nox の利用を検討しましょう
$ pip install -e .[testing]
$ pytest
build で配布物を作る
▶ build を使って配布物を作成します
▶ dist ディレクトリ以下に sdist と wheel が作成されます
$ python -m build .
$ ls dist
配布する
▶ 大きく公開する場合は twine を使って PyPI にアップロードし
ます
▶ 事前に PyPI アカウントを作っておきましょう
▶ プライベートリリースなどでは simple repository にすると面
倒が減るかもしれません
▶ 今回は説明しません
$ python -m twine upload dist/*.whl
まとめ
まとめ
▶ パッケージングのアクションごとに別々のツールが提供され
ている
▶ PEP 標準に準拠するように setuptools もがんばっている
▶ setuptools が持っていた機能を PEP で練り直して標準化して
いる
参考文献
▶ Python Packaging User Guide
▶ setuptools Documentation
▶ Distributing Python Modules (Legacy version)
▶ SPDX License List
▶ PEPs
▶ PEP 427 – The Wheel Binary Package Format 1.0
▶ PEP 503 – Simple Repository API
▶ PEP 517 – A build-system independent format for source trees
▶ PEP 518 – Specifying Minimum Build System Requirements for
Python Projects
▶ PEP 621 – Storing project metadata in pyproject.toml
▶ PEP 566 – Metadata for Python Software Packages 2.1
▶ Welcome to the tox automation project
▶ Welcome to Nox

More Related Content

What's hot (20)

PPTX
分散システムについて語らせてくれ
Kumazaki Hiroki
 
PPTX
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
Tokoroten Nakayama
 
PPTX
OpenAI FineTuning を試してみる
iPride Co., Ltd.
 
PDF
ビジネスパーソンのためのDX入門講座エッセンス版
Tokoroten Nakayama
 
PDF
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
 
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
PDF
分散システムの限界について知ろう
Shingo Omura
 
PPTX
Istioサービスメッシュ入門
Yoichi Kawasaki
 
PDF
SQLで身につける!初めてのレコメンド 〜 基礎から応用まで ~
Naoto Tamiya
 
PDF
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
 
PDF
アジャイル開発の現在・過去・未来~今を知り、源流を訪ね、先を見据える~
Kenji Hiranabe
 
PDF
コンテナ未経験新人が学ぶコンテナ技術入門
Kohei Tokunaga
 
PDF
「顧客の声を聞かない」とはどういうことか
Yoshiki Hayama
 
PDF
CuPy解説
Ryosuke Okuta
 
PDF
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
Preferred Networks
 
PPTX
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
Tokoroten Nakayama
 
PPTX
SQLチューニング入門 入門編
Miki Shimogai
 
PPTX
Azure API Management 俺的マニュアル
貴志 上坂
 
PPTX
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
Shota Shinogi
 
PPTX
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
歩 柴田
 
分散システムについて語らせてくれ
Kumazaki Hiroki
 
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
Tokoroten Nakayama
 
OpenAI FineTuning を試してみる
iPride Co., Ltd.
 
ビジネスパーソンのためのDX入門講座エッセンス版
Tokoroten Nakayama
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
分散システムの限界について知ろう
Shingo Omura
 
Istioサービスメッシュ入門
Yoichi Kawasaki
 
SQLで身につける!初めてのレコメンド 〜 基礎から応用まで ~
Naoto Tamiya
 
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
 
アジャイル開発の現在・過去・未来~今を知り、源流を訪ね、先を見据える~
Kenji Hiranabe
 
コンテナ未経験新人が学ぶコンテナ技術入門
Kohei Tokunaga
 
「顧客の声を聞かない」とはどういうことか
Yoshiki Hayama
 
CuPy解説
Ryosuke Okuta
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
Preferred Networks
 
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
Tokoroten Nakayama
 
SQLチューニング入門 入門編
Miki Shimogai
 
Azure API Management 俺的マニュアル
貴志 上坂
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
Shota Shinogi
 
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
歩 柴田
 

Similar to みんなのPython勉強会#77 パッケージングしよう (20)

PDF
パッケージングの今
Atsushi Odagiri
 
PDF
Pythonを取り巻く開発環境 #pyconjp
Yoshifumi Yamaguchi
 
PDF
PYTHON PACKAGING (PyFes 2012.03 発表資料)
Takayuki Shimizukawa
 
PDF
パッケージングの呼び声 Python Charity Talks in Japan 2021.02
Atsushi Odagiri
 
PDF
Distutil setuptools distribute
Atsushi Odagiri
 
PDF
Python パッケージの影響を歴史から理解してみよう!
Kir Chou
 
PDF
パッケージングを支える技術 pyconjp2016
Atsushi Odagiri
 
KEY
ひのきのぼうだけで全クリ目指す
AromaBlack
 
PDF
パッケージングの今と未来
Atsushi Odagiri
 
PDF
Python3 プログラミング勉強会
Tetsuya Morimoto
 
PDF
Pyconjp2014_implementations
masahitojp
 
PDF
Python virenv
Satoshi Ohki
 
PDF
pyconjp 2019 LT 今日のsetuptools
Atsushi Odagiri
 
PDF
Building document with the Sphinx public edtion
Yukihiko SAWANOBORI
 
PDF
Wrapping a C++ library with Cython
fuzzysphere
 
PDF
Yesod on Heroku
Takahiro Himura
 
PDF
ソフトウェア工学2023 14 ビルド
Toru Tamaki
 
PDF
Rの拡張を書く (R 2.15.2)
itoyan110
 
PPTX
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
Katsuhiro Morishita
 
PDF
Pythonとパッケージングと私
Atsushi Odagiri
 
パッケージングの今
Atsushi Odagiri
 
Pythonを取り巻く開発環境 #pyconjp
Yoshifumi Yamaguchi
 
PYTHON PACKAGING (PyFes 2012.03 発表資料)
Takayuki Shimizukawa
 
パッケージングの呼び声 Python Charity Talks in Japan 2021.02
Atsushi Odagiri
 
Distutil setuptools distribute
Atsushi Odagiri
 
Python パッケージの影響を歴史から理解してみよう!
Kir Chou
 
パッケージングを支える技術 pyconjp2016
Atsushi Odagiri
 
ひのきのぼうだけで全クリ目指す
AromaBlack
 
パッケージングの今と未来
Atsushi Odagiri
 
Python3 プログラミング勉強会
Tetsuya Morimoto
 
Pyconjp2014_implementations
masahitojp
 
Python virenv
Satoshi Ohki
 
pyconjp 2019 LT 今日のsetuptools
Atsushi Odagiri
 
Building document with the Sphinx public edtion
Yukihiko SAWANOBORI
 
Wrapping a C++ library with Cython
fuzzysphere
 
Yesod on Heroku
Takahiro Himura
 
ソフトウェア工学2023 14 ビルド
Toru Tamaki
 
Rの拡張を書く (R 2.15.2)
itoyan110
 
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
Katsuhiro Morishita
 
Pythonとパッケージングと私
Atsushi Odagiri
 
Ad

More from Atsushi Odagiri (20)

PDF
async/await の向こう側 PyCon Kyushu 2022
Atsushi Odagiri
 
PDF
eggとはなんだったのか 栄光のsetuptools
Atsushi Odagiri
 
PDF
Pythonでの開発を効率的に進めるためのツール設定
Atsushi Odagiri
 
PDF
Python3 移行への軌跡
Atsushi Odagiri
 
PDF
Sqlalchemy sqlの錬金術
Atsushi Odagiri
 
PPTX
Clack meetup #1 lt
Atsushi Odagiri
 
PDF
Pyramid入門
Atsushi Odagiri
 
PDF
パッケージングの今と未来
Atsushi Odagiri
 
PDF
Bplt11 form alchemy
Atsushi Odagiri
 
PDF
Python3でwebアプリ
Atsushi Odagiri
 
PDF
Pyconjp2012 memory-of-europython
Atsushi Odagiri
 
PDF
What makes pyramid unique
Atsushi Odagiri
 
PDF
エキPy lt repoze.whoの紹介
Atsushi Odagiri
 
PDF
World plonedaylt
Atsushi Odagiri
 
PDF
Setup.pysetup.cfg
Atsushi Odagiri
 
PDF
BPStudy#54 そろそろPython3
Atsushi Odagiri
 
PDF
Form libraries
Atsushi Odagiri
 
PDF
フレームワークなしでWSGIプログラミング
Atsushi Odagiri
 
PDF
Form libraries
Atsushi Odagiri
 
PDF
Aodag scaffold
Atsushi Odagiri
 
async/await の向こう側 PyCon Kyushu 2022
Atsushi Odagiri
 
eggとはなんだったのか 栄光のsetuptools
Atsushi Odagiri
 
Pythonでの開発を効率的に進めるためのツール設定
Atsushi Odagiri
 
Python3 移行への軌跡
Atsushi Odagiri
 
Sqlalchemy sqlの錬金術
Atsushi Odagiri
 
Clack meetup #1 lt
Atsushi Odagiri
 
Pyramid入門
Atsushi Odagiri
 
パッケージングの今と未来
Atsushi Odagiri
 
Bplt11 form alchemy
Atsushi Odagiri
 
Python3でwebアプリ
Atsushi Odagiri
 
Pyconjp2012 memory-of-europython
Atsushi Odagiri
 
What makes pyramid unique
Atsushi Odagiri
 
エキPy lt repoze.whoの紹介
Atsushi Odagiri
 
World plonedaylt
Atsushi Odagiri
 
Setup.pysetup.cfg
Atsushi Odagiri
 
BPStudy#54 そろそろPython3
Atsushi Odagiri
 
Form libraries
Atsushi Odagiri
 
フレームワークなしでWSGIプログラミング
Atsushi Odagiri
 
Form libraries
Atsushi Odagiri
 
Aodag scaffold
Atsushi Odagiri
 
Ad

Recently uploaded (9)

PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2024_報告会資料_増野さ...
IGDA Japan SIG-Audio
 
PDF
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
 
PDF
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
 
PDF
API認可を支えるKeycloakの基本と設計の考え方 ~ OAuth/OIDCによるAPI保護のベストプラクティス ~
Hitachi, Ltd. OSS Solution Center.
 
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2025_報告会資料_渡辺さ...
IGDA Japan SIG-Audio
 
PDF
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
 
PDF
マルチAIエージェントの産業界での実践に向けたオープンソース活動の展望 - Japan Regional User Group (RUG) Meet-Up
Kosaku Kimura
 
PDF
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
 
PDF
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2024_報告会資料_増野さ...
IGDA Japan SIG-Audio
 
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
 
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
 
API認可を支えるKeycloakの基本と設計の考え方 ~ OAuth/OIDCによるAPI保護のベストプラクティス ~
Hitachi, Ltd. OSS Solution Center.
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2025_報告会資料_渡辺さ...
IGDA Japan SIG-Audio
 
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
 
マルチAIエージェントの産業界での実践に向けたオープンソース活動の展望 - Japan Regional User Group (RUG) Meet-Up
Kosaku Kimura
 
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
 
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
 

みんなのPython勉強会#77 パッケージングしよう