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)

PDF
機械学習モデルのハイパパラメータ最適化
gree_tech
 
PDF
機械学習 入門
Hayato Maki
 
PDF
状態空間モデルの考え方・使い方 - TokyoR #38
horihorio
 
PDF
SAT/SMTソルバの仕組み
Masahiro Sakai
 
PDF
工学系大学4年生のための論文の読み方
ychtanaka
 
PDF
Transformer メタサーベイ
cvpaper. challenge
 
PDF
GPU と PYTHON と、それから最近の NVIDIA
NVIDIA Japan
 
PDF
深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで
Yahoo!デベロッパーネットワーク
 
PDF
Surveyから始まる研究者への道 - Stand on the shoulders of giants -
諒介 荒木
 
PDF
機械学習による統計的実験計画(ベイズ最適化を中心に)
Kota Matsui
 
PPTX
先駆者に学ぶ MLOpsの実際
Tetsutaro Watanabe
 
PDF
(修正)機械学習デザインパターン(ML Design Patterns)の解説
Hironori Washizaki
 
PDF
機械学習モデルのサービングとは?
Sho Tanaka
 
PPTX
Greed is Good: 劣モジュラ関数最大化とその発展
Yuichi Yoshida
 
PDF
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
mlm_kansai
 
PDF
決定木・回帰木に基づくアンサンブル学習の最近
Ichigaku Takigawa
 
PDF
Python パッケージの影響を歴史から理解してみよう!
Kir Chou
 
PDF
[DL輪読会]1次近似系MAMLとその理論的背景
Deep Learning JP
 
PPTX
【DL輪読会】ViT + Self Supervised Learningまとめ
Deep Learning JP
 
PDF
ChatGPT 人間のフィードバックから強化学習した対話AI
Shota Imai
 
機械学習モデルのハイパパラメータ最適化
gree_tech
 
機械学習 入門
Hayato Maki
 
状態空間モデルの考え方・使い方 - TokyoR #38
horihorio
 
SAT/SMTソルバの仕組み
Masahiro Sakai
 
工学系大学4年生のための論文の読み方
ychtanaka
 
Transformer メタサーベイ
cvpaper. challenge
 
GPU と PYTHON と、それから最近の NVIDIA
NVIDIA Japan
 
深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで
Yahoo!デベロッパーネットワーク
 
Surveyから始まる研究者への道 - Stand on the shoulders of giants -
諒介 荒木
 
機械学習による統計的実験計画(ベイズ最適化を中心に)
Kota Matsui
 
先駆者に学ぶ MLOpsの実際
Tetsutaro Watanabe
 
(修正)機械学習デザインパターン(ML Design Patterns)の解説
Hironori Washizaki
 
機械学習モデルのサービングとは?
Sho Tanaka
 
Greed is Good: 劣モジュラ関数最大化とその発展
Yuichi Yoshida
 
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
mlm_kansai
 
決定木・回帰木に基づくアンサンブル学習の最近
Ichigaku Takigawa
 
Python パッケージの影響を歴史から理解してみよう!
Kir Chou
 
[DL輪読会]1次近似系MAMLとその理論的背景
Deep Learning JP
 
【DL輪読会】ViT + Self Supervised Learningまとめ
Deep Learning JP
 
ChatGPT 人間のフィードバックから強化学習した対話AI
Shota Imai
 

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
パッケージングを支える技術 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
 
PDF
明日からはじめるネットワーク運用自動化
Taiji Tsuchiya
 
パッケージングの今
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
 
パッケージングを支える技術 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
 
明日からはじめるネットワーク運用自動化
Taiji Tsuchiya
 
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 (10)

PDF
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
PDF
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
PDF
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
PDF
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
PDF
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
PDF
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
PDF
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
PDF
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
PDF
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 

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