SlideShare a Scribd company logo
Preface setup.cfg pyproject.toml conclusion
Pythonとパッケージングと私
Atsushi Odagiri
2017-09-08
Preface setup.cfg pyproject.toml conclusion
お前誰よ
• Atsushi Odagiri
• Open Collector, Inc.
• Repoze/Pylons/Pyramid
Preface setup.cfg pyproject.toml conclusion
パッケージングの基本
• pypi パッケージリポジトリ
• pip インストーラー
• setuptools/wheel パッケージャー
• virtualenv 仮想環境
Preface setup.cfg pyproject.toml conclusion
pypi
• pypi.python.org - 現在
• pypi.org - 次バージョン
• 徐々に pypi.org ドメインに機能移動
Preface setup.cfg pyproject.toml conclusion
pip
• sdist や wheel をリポジトリからダウンロードしてイン
ストールなど
• インストールされてるパッケージの状況を取得など
• pip 9.0.1
Preface setup.cfg pyproject.toml conclusion
setuptools/wheel
• setup.py から wheel を作る
• setuptools 36.4.0
• wheel 0.29.0
Preface setup.cfg pyproject.toml conclusion
virtualenv
• ライブラリのインストール先をプロジェクトごとに
分離
• virtualenv 15.1.0
• pip 9.0.1
• setuptools 28.0.0
Preface setup.cfg pyproject.toml conclusion
pipとvertualenvの使い方
$ virtualenv venv
$ . venv/bin/activate
(venv)$ pip install -U pip setuptools wheel
(venv)$ cat > requirements.txt
pyramid
ˆD
(venv)$ pip install -r requirements.txt
(venv)$ pip list –format=columns
Package Version
————– ——-
Pyramid 1.9
Preface setup.cfg pyproject.toml conclusion
wheelhouseにバンドル
(venv)$ pip freeze > constraints.txt
(venv)$ mkdir wheelhouse
(venv)$ pip wheel -r requirements.txt -c
constraints.txt -w wheelhouse -f wheelhouse
(venv)$ deactivate
$ virtualenv venv2
$ . venv2/bin/activate
(venv2)$ pip install -r requirements.txt -c
constraints.txt –no-index -f wheelhouse
Preface setup.cfg pyproject.toml conclusion
パッケージを作るには?
• setuptools を使う
• setup.py を書く
• setup.py で bdist_wheel コマンドを実行する
• setup.py upload か twine で pypi にアップロードする
(事前にアカウント作成必要)
Preface setup.cfg pyproject.toml conclusion
setup.py
from setuptools import setup, find_packages
import sample
setup(
name="sample-package",
version=sample.version,
author="Atsushi Odagiri",
author_email="aodagx@gmail.com",
description="sample package to use setup.py",
long_description="""
""",
url="https://aodag.jp/sample-package",
license="MIT",
packages=find_packages(),
)
Preface setup.cfg pyproject.toml conclusion
setup.pyのだめなとこ
• 設定と実行コードが混在
• long_description を外部ファイルに書くことが多い
• ファイル指定などは提供されてない
• みんなそれぞれ setup.py の中でファイルを読み込む処
理を書いてる
• パッケージのメタデータとして扱われる項目と
setuptools が利用する項目が分かれてない
Preface setup.cfg pyproject.toml conclusion
setup.cfg にパッケージメタデータを書こう
• setuptools 30.3.0 から setup.cfg にメタデータを書ける
ようになった
• metadata セクションと options セクション に書く
• ほぼ setup 関数の引数のまま
Preface setup.cfg pyproject.toml conclusion
setup.cfg にメタデータを書いた場合の setup.py
from setuptools import setup
setup()
シンプル!
Preface setup.cfg pyproject.toml conclusion
metadataセクションの主な項目
• name
• version
• author
• author_email
• description
• long_description
• url
• lisence
• classifiers
Preface setup.cfg pyproject.toml conclusion
実際のsetup.cfg(metadataセクション)
[metadata]
name = sample-package
version = attr:sample.version
author = Atsushi Odagiri
author_email = aodagx@gmail.com
description = sample package to use setup.cfg
long_description = file:README.rst
url = https://aodag.jp/sample-package
license = MIT
Preface setup.cfg pyproject.toml conclusion
特殊な項目
• version
• 直接書いてもいいが attr: でオブジェクトの内容を利用
できる
• callable な場合は評価された結果がバージョンになる
• 実行されてしまうので import するだけで副作用が起き
るコードは要注意
• long_description
• 直接書いてもいいが file: で指定したファイルの内容を
利用できる
• 今のところ 1 ファイルしか指定できない
Preface setup.cfg pyproject.toml conclusion
optionsセクションの主な項目
• packages
• install_requires
• entry_points
Preface setup.cfg pyproject.toml conclusion
options.* なセクション
• options.extras_require
• options.packages.find
Preface setup.cfg pyproject.toml conclusion
実際のsetup.cfg(optionsセクション)
[options]
install_requires =
pyramid
sqlalchemy
jinja2
packages = find:
entry_points = file:entry_points.cfg
Preface setup.cfg pyproject.toml conclusion
実際のsetup.cfg(options.* セクション)
[options.extras_require]
testing =
pytest
mysql =
pymysql
postgres =
psycopg2
[options.packages.find]
exclude =
tests
examples
Preface setup.cfg pyproject.toml conclusion
options の特殊な項目
• packages
• 自分で全部羅列してもよい
• find_packages 相当のことをする場合、 find: とだけ指
定して options.packages でオプション指定する
• entry_points
• 別途 entry_points を記述したファイルを指定するか
options.entry_points セクションで指定する
Preface setup.cfg pyproject.toml conclusion
entry_pointsのファイル
[console_scripts]
hello = sample:hello
Preface setup.cfg pyproject.toml conclusion
options.entry_points での指定方法
[options.entry_points]
console_scripts =
hello=sample:hello
Preface setup.cfg pyproject.toml conclusion
pbrとの違い
• pbr は setuptools の拡張
• openstack プロジェクトがパッケージングのために作成
した
• setup.cfg にメタデータを記述する
• その他 git タグによるバージョニングなど
• setup.cfg の項目がちょっと違う
Preface setup.cfg pyproject.toml conclusion
バージョンをgitタグから自動で設定したい
setuptools_scm を使うと git タグからバージョンを生成で
きる
setup(
name="example",
setup_require=["setuptools_scm"],
use_scm_version=True,
)
Preface setup.cfg pyproject.toml conclusion
setup.cfgでsetuptools_scmを試してみる
version = attr:setuptools_scm.get_version
• callable を指定すると評価結果がバージョンになる
• 実行時に setuptools_scm が入ってないといけない
• setuptools_scm が必要だということは setup_requires
で指定できるが…
Preface setup.cfg pyproject.toml conclusion
setup.cfg の setup_requires
• setup.cfg に書いたのではもう遅い
• setup 関数に書くしかない?
setup(setup_requires=["setuptools_scm"])
Preface setup.cfg pyproject.toml conclusion
setuptoolsの機能追加や拡張など
• setuptools のバージョンが古いと setup.cfg の機能が使
えない
• ユーザーの setuptools のバージョンは不確定
• setup_requires のタイミングは微妙
• 結局 setuptools の実装に頼っている部分があまり明確に
なってない
Preface setup.cfg pyproject.toml conclusion
build-system
• setuptools 以外のビルドツールを指定できる
• setuptools を使う場合でも必要な拡張やバージョンを指
定できる
Preface setup.cfg pyproject.toml conclusion
PEP 518
• pyproject.toml でビルドツールを指定する
• 存在しなければ今までの setuptools によるビルド
Preface setup.cfg pyproject.toml conclusion
pyproject.toml の形式
ビルドツールに flit を使う場合の例
[build-system]
requires = ["flit"]
backend = "flit.buildapi"
Preface setup.cfg pyproject.toml conclusion
ビルドツールの実装について
• PEP516
• コマンドラインでの実装
• reject されました
• PEP517
• API での実装
• 議論中
Preface setup.cfg pyproject.toml conclusion
PEP517で定義されてるAPI
• build_wheel
• build_sdist
• optional get_requires_for_build_wheel
• optional prepare_metadata_for_build_wheel
• optional get_requires_for_build_sdist
Preface setup.cfg pyproject.toml conclusion
pipのPEP518,PEP517対応
• pyproject.tom の読み込み [PEP518] はマージされている
• setup_requires の問題は解決できそう
• 隔離された環境での wheel 生成
• まだツールは setuptools 固定 [PEP517 未対応]
Preface setup.cfg pyproject.toml conclusion
flit: setuptools以外のパッケージングツール
• flit は setuptools とは別のパッケージングツール
• filit.ini でメタデータを書く
• シンプル
Preface setup.cfg pyproject.toml conclusion
flit を使うには
$ pip install flit
$ flit init
$ flit wheel
Preface setup.cfg pyproject.toml conclusion
flit の PEP517対応
• toml-config ブランチ
• flit.buildapi
Preface setup.cfg pyproject.toml conclusion
flitを使うべきか?
• pip の対応ができてないと sdist としてインストールで
きない
• wheel だけで配布するというのなら今からでも可能
• setuptools 自体も setup.cfg への移行など進んでる
• 個人的にはオルタナティブなツールは歓迎だが、使う
かっていうと…
Preface setup.cfg pyproject.toml conclusion
話し足りないこと
• プライベートパッケージリポジトリ
• Windows での C 拡張
• pip へのコントリビュート
• conda2wheel
Preface setup.cfg pyproject.toml conclusion
まとめ
• setuptools ちょっとだけ進化
• sdist から wheel を作る流れが PEP で定義される
• setuptools 使わなくてもよい未来

More Related Content

PDF
最適輸送入門
joisino
 
PDF
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
Preferred Networks
 
PDF
最適輸送の解き方
joisino
 
PDF
グラフニューラルネットワークとグラフ組合せ問題
joisino
 
PDF
Docker Compose 徹底解説
Masahito Zembutsu
 
PDF
#logstudy 01 rsyslog入門
Takashi Takizawa
 
PDF
DQNからRainbowまで 〜深層強化学習の最新動向〜
Jun Okumura
 
PPTX
【DL輪読会】マルチモーダル 基盤モデル
Deep Learning JP
 
最適輸送入門
joisino
 
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
Preferred Networks
 
最適輸送の解き方
joisino
 
グラフニューラルネットワークとグラフ組合せ問題
joisino
 
Docker Compose 徹底解説
Masahito Zembutsu
 
#logstudy 01 rsyslog入門
Takashi Takizawa
 
DQNからRainbowまで 〜深層強化学習の最新動向〜
Jun Okumura
 
【DL輪読会】マルチモーダル 基盤モデル
Deep Learning JP
 

What's hot (20)

PPTX
テストコードの DRY と DAMP
Yusuke Kagata
 
PDF
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
 
PDF
NumPyが物足りない人へのCython入門
Shiqiao Du
 
PDF
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
 
PDF
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
 
PDF
工学系大学4年生のための論文の読み方
ychtanaka
 
PPTX
Docker超入門
VirtualTech Japan Inc.
 
PDF
最適化超入門
Takami Sato
 
PDF
人と人の相性を考慮したシフトスケジューラ
鈴木 庸氏
 
PDF
BigQuery で 150万円 使ったときの話
itkr
 
PPTX
深層学習の数理
Taiji Suzuki
 
PDF
GPT解説
MasayoshiTsutsui
 
PPT
Glibc malloc internal
Motohiro KOSAKI
 
PPTX
モデル高速化百選
Yusuke Uchida
 
PDF
【DL輪読会】Code as Policies: Language Model Programs for Embodied Control
Deep Learning JP
 
PPTX
AVX-512(フォーマット)詳解
MITSUNARI Shigeo
 
PPTX
CatBoost on GPU のひみつ
Takuji Tahara
 
PDF
Newman アルゴリズムによるソーシャルグラフのクラスタリング
Atsushi KOMIYA
 
PDF
DSIRNLP#1 ランキング学習ことはじめ
sleepy_yoshi
 
PPTX
CyberChefの使い方(HamaCTF2019 WriteUp編)
Shota Shinogi
 
テストコードの DRY と DAMP
Yusuke Kagata
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
 
NumPyが物足りない人へのCython入門
Shiqiao Du
 
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
 
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
 
工学系大学4年生のための論文の読み方
ychtanaka
 
Docker超入門
VirtualTech Japan Inc.
 
最適化超入門
Takami Sato
 
人と人の相性を考慮したシフトスケジューラ
鈴木 庸氏
 
BigQuery で 150万円 使ったときの話
itkr
 
深層学習の数理
Taiji Suzuki
 
GPT解説
MasayoshiTsutsui
 
Glibc malloc internal
Motohiro KOSAKI
 
モデル高速化百選
Yusuke Uchida
 
【DL輪読会】Code as Policies: Language Model Programs for Embodied Control
Deep Learning JP
 
AVX-512(フォーマット)詳解
MITSUNARI Shigeo
 
CatBoost on GPU のひみつ
Takuji Tahara
 
Newman アルゴリズムによるソーシャルグラフのクラスタリング
Atsushi KOMIYA
 
DSIRNLP#1 ランキング学習ことはじめ
sleepy_yoshi
 
CyberChefの使い方(HamaCTF2019 WriteUp編)
Shota Shinogi
 
Ad

Viewers also liked (14)

PDF
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
hirokiky
 
PDF
Pycon jp2017 20170908_ota
博三 太田
 
PDF
Introducing wsgi_lineprof / PyCon JP 2017 LT
Yusuke Miyazaki
 
PPTX
ドローンのフライトコントローラをPythonで制御してみた話
Lina Katayose
 
PDF
OpenAPIを利用したPythonWebアプリケーション開発
Takuro Wada
 
PDF
Pythonistaで始めるiOSプロトタイプ開発
Yusuke Muraoka
 
PDF
Pythonが動く仕組み(の概要)
Yoshiaki Shibutani
 
PDF
Djangoフレームワークのユーザーモデルと認証
Shinya Okano
 
PDF
PyCon JP 2017Yuta Kitagami
Yuta Kitagami
 
PDF
Python におけるドメイン駆動設計(戦術面)の勘どころ
Junya Hayashi
 
PDF
PyconJP2017 Kivyによるアプリケーション開発のすすめ
Jun Okazaki
 
PDF
Pythonはどうやってlen関数で長さを手にいれているの?
Takayuki Shimizukawa
 
PDF
Pycon2017
Yuta Kashino
 
PDF
Pythonと機械学習によるWebセキュリティの自動化
Isao Takaesu
 
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
hirokiky
 
Pycon jp2017 20170908_ota
博三 太田
 
Introducing wsgi_lineprof / PyCon JP 2017 LT
Yusuke Miyazaki
 
ドローンのフライトコントローラをPythonで制御してみた話
Lina Katayose
 
OpenAPIを利用したPythonWebアプリケーション開発
Takuro Wada
 
Pythonistaで始めるiOSプロトタイプ開発
Yusuke Muraoka
 
Pythonが動く仕組み(の概要)
Yoshiaki Shibutani
 
Djangoフレームワークのユーザーモデルと認証
Shinya Okano
 
PyCon JP 2017Yuta Kitagami
Yuta Kitagami
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Junya Hayashi
 
PyconJP2017 Kivyによるアプリケーション開発のすすめ
Jun Okazaki
 
Pythonはどうやってlen関数で長さを手にいれているの?
Takayuki Shimizukawa
 
Pycon2017
Yuta Kashino
 
Pythonと機械学習によるWebセキュリティの自動化
Isao Takaesu
 
Ad

Similar to Pythonとパッケージングと私 (17)

PDF
みんなのPython勉強会#77 パッケージングしよう
Atsushi Odagiri
 
PDF
パッケージングの今
Atsushi Odagiri
 
PDF
書こう! 使おう! 単体テスト
ryohji ikebe
 
PDF
Products.PloneOrg
Takanori Suzuki
 
PPTX
PyPI入門2018
Yukino Ikegami
 
PDF
書こう! 使おう! 単体テスト
ryohji ikebe
 
PPTX
勉強会 Cvml python基礎
真哉 杉野
 
PDF
Git pyfes201207-presen
Kouhei Maeda
 
PDF
Fabric
Joe_noh
 
PDF
Pylons ユーザのための Pyramid 移行ガイド
Nozomu Kaneko
 
PDF
qmake入門
hermit4 Ishida
 
PDF
Pythonを取り巻く開発環境 #pyconjp
Yoshifumi Yamaguchi
 
PDF
Jubakitの解説
JubatusOfficial
 
PPTX
Jubatus: Jubakitでもっと楽をしよう
Tetsuya Shioda
 
KEY
ひのきのぼうだけで全クリ目指す
AromaBlack
 
PPTX
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
エピック・ゲームズ・ジャパン Epic Games Japan
 
PDF
今最もアツイdistribution Gentoo Linuxについて
Takuto Matsuu
 
みんなのPython勉強会#77 パッケージングしよう
Atsushi Odagiri
 
パッケージングの今
Atsushi Odagiri
 
書こう! 使おう! 単体テスト
ryohji ikebe
 
Products.PloneOrg
Takanori Suzuki
 
PyPI入門2018
Yukino Ikegami
 
書こう! 使おう! 単体テスト
ryohji ikebe
 
勉強会 Cvml python基礎
真哉 杉野
 
Git pyfes201207-presen
Kouhei Maeda
 
Fabric
Joe_noh
 
Pylons ユーザのための Pyramid 移行ガイド
Nozomu Kaneko
 
qmake入門
hermit4 Ishida
 
Pythonを取り巻く開発環境 #pyconjp
Yoshifumi Yamaguchi
 
Jubakitの解説
JubatusOfficial
 
Jubatus: Jubakitでもっと楽をしよう
Tetsuya Shioda
 
ひのきのぼうだけで全クリ目指す
AromaBlack
 
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
エピック・ゲームズ・ジャパン Epic Games Japan
 
今最もアツイdistribution Gentoo Linuxについて
Takuto Matsuu
 

More from Atsushi Odagiri (20)

PDF
async/await の向こう側 PyCon Kyushu 2022
Atsushi Odagiri
 
PDF
パッケージングの呼び声 Python Charity Talks in Japan 2021.02
Atsushi Odagiri
 
PDF
eggとはなんだったのか 栄光のsetuptools
Atsushi Odagiri
 
PDF
pyconjp 2019 LT 今日のsetuptools
Atsushi Odagiri
 
PDF
Pythonでの開発を効率的に進めるためのツール設定
Atsushi Odagiri
 
PDF
Python3 移行への軌跡
Atsushi Odagiri
 
PDF
パッケージングを支える技術 pyconjp2016
Atsushi Odagiri
 
PDF
Sqlalchemy sqlの錬金術
Atsushi Odagiri
 
PPTX
Clack meetup #1 lt
Atsushi Odagiri
 
PDF
Pyramid入門
Atsushi Odagiri
 
PDF
パッケージングの今と未来
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
 
async/await の向こう側 PyCon Kyushu 2022
Atsushi Odagiri
 
パッケージングの呼び声 Python Charity Talks in Japan 2021.02
Atsushi Odagiri
 
eggとはなんだったのか 栄光のsetuptools
Atsushi Odagiri
 
pyconjp 2019 LT 今日のsetuptools
Atsushi Odagiri
 
Pythonでの開発を効率的に進めるためのツール設定
Atsushi Odagiri
 
Python3 移行への軌跡
Atsushi Odagiri
 
パッケージングを支える技術 pyconjp2016
Atsushi Odagiri
 
Sqlalchemy sqlの錬金術
Atsushi Odagiri
 
Clack meetup #1 lt
Atsushi Odagiri
 
Pyramid入門
Atsushi Odagiri
 
パッケージングの今と未来
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
 

Recently uploaded (11)

PDF
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
PDF
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
PDF
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
PDF
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
PPTX
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
PDF
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
PDF
LoRaWAN ウェザーステーションキット v3 -WSC3-L 日本語ユーザーマニュアル
CRI Japan, Inc.
 
PDF
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
PPTX
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
PDF
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
PDF
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
LoRaWAN ウェザーステーションキット v3 -WSC3-L 日本語ユーザーマニュアル
CRI Japan, Inc.
 
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 

Pythonとパッケージングと私

  • 1. Preface setup.cfg pyproject.toml conclusion Pythonとパッケージングと私 Atsushi Odagiri 2017-09-08
  • 2. Preface setup.cfg pyproject.toml conclusion お前誰よ • Atsushi Odagiri • Open Collector, Inc. • Repoze/Pylons/Pyramid
  • 3. Preface setup.cfg pyproject.toml conclusion パッケージングの基本 • pypi パッケージリポジトリ • pip インストーラー • setuptools/wheel パッケージャー • virtualenv 仮想環境
  • 4. Preface setup.cfg pyproject.toml conclusion pypi • pypi.python.org - 現在 • pypi.org - 次バージョン • 徐々に pypi.org ドメインに機能移動
  • 5. Preface setup.cfg pyproject.toml conclusion pip • sdist や wheel をリポジトリからダウンロードしてイン ストールなど • インストールされてるパッケージの状況を取得など • pip 9.0.1
  • 6. Preface setup.cfg pyproject.toml conclusion setuptools/wheel • setup.py から wheel を作る • setuptools 36.4.0 • wheel 0.29.0
  • 7. Preface setup.cfg pyproject.toml conclusion virtualenv • ライブラリのインストール先をプロジェクトごとに 分離 • virtualenv 15.1.0 • pip 9.0.1 • setuptools 28.0.0
  • 8. Preface setup.cfg pyproject.toml conclusion pipとvertualenvの使い方 $ virtualenv venv $ . venv/bin/activate (venv)$ pip install -U pip setuptools wheel (venv)$ cat > requirements.txt pyramid ˆD (venv)$ pip install -r requirements.txt (venv)$ pip list –format=columns Package Version ————– ——- Pyramid 1.9
  • 9. Preface setup.cfg pyproject.toml conclusion wheelhouseにバンドル (venv)$ pip freeze > constraints.txt (venv)$ mkdir wheelhouse (venv)$ pip wheel -r requirements.txt -c constraints.txt -w wheelhouse -f wheelhouse (venv)$ deactivate $ virtualenv venv2 $ . venv2/bin/activate (venv2)$ pip install -r requirements.txt -c constraints.txt –no-index -f wheelhouse
  • 10. Preface setup.cfg pyproject.toml conclusion パッケージを作るには? • setuptools を使う • setup.py を書く • setup.py で bdist_wheel コマンドを実行する • setup.py upload か twine で pypi にアップロードする (事前にアカウント作成必要)
  • 11. Preface setup.cfg pyproject.toml conclusion setup.py from setuptools import setup, find_packages import sample setup( name="sample-package", version=sample.version, author="Atsushi Odagiri", author_email="[email protected]", description="sample package to use setup.py", long_description=""" """, url="https://aodag.jp/sample-package", license="MIT", packages=find_packages(), )
  • 12. Preface setup.cfg pyproject.toml conclusion setup.pyのだめなとこ • 設定と実行コードが混在 • long_description を外部ファイルに書くことが多い • ファイル指定などは提供されてない • みんなそれぞれ setup.py の中でファイルを読み込む処 理を書いてる • パッケージのメタデータとして扱われる項目と setuptools が利用する項目が分かれてない
  • 13. Preface setup.cfg pyproject.toml conclusion setup.cfg にパッケージメタデータを書こう • setuptools 30.3.0 から setup.cfg にメタデータを書ける ようになった • metadata セクションと options セクション に書く • ほぼ setup 関数の引数のまま
  • 14. Preface setup.cfg pyproject.toml conclusion setup.cfg にメタデータを書いた場合の setup.py from setuptools import setup setup() シンプル!
  • 15. Preface setup.cfg pyproject.toml conclusion metadataセクションの主な項目 • name • version • author • author_email • description • long_description • url • lisence • classifiers
  • 16. Preface setup.cfg pyproject.toml conclusion 実際のsetup.cfg(metadataセクション) [metadata] name = sample-package version = attr:sample.version author = Atsushi Odagiri author_email = [email protected] description = sample package to use setup.cfg long_description = file:README.rst url = https://aodag.jp/sample-package license = MIT
  • 17. Preface setup.cfg pyproject.toml conclusion 特殊な項目 • version • 直接書いてもいいが attr: でオブジェクトの内容を利用 できる • callable な場合は評価された結果がバージョンになる • 実行されてしまうので import するだけで副作用が起き るコードは要注意 • long_description • 直接書いてもいいが file: で指定したファイルの内容を 利用できる • 今のところ 1 ファイルしか指定できない
  • 18. Preface setup.cfg pyproject.toml conclusion optionsセクションの主な項目 • packages • install_requires • entry_points
  • 19. Preface setup.cfg pyproject.toml conclusion options.* なセクション • options.extras_require • options.packages.find
  • 20. Preface setup.cfg pyproject.toml conclusion 実際のsetup.cfg(optionsセクション) [options] install_requires = pyramid sqlalchemy jinja2 packages = find: entry_points = file:entry_points.cfg
  • 21. Preface setup.cfg pyproject.toml conclusion 実際のsetup.cfg(options.* セクション) [options.extras_require] testing = pytest mysql = pymysql postgres = psycopg2 [options.packages.find] exclude = tests examples
  • 22. Preface setup.cfg pyproject.toml conclusion options の特殊な項目 • packages • 自分で全部羅列してもよい • find_packages 相当のことをする場合、 find: とだけ指 定して options.packages でオプション指定する • entry_points • 別途 entry_points を記述したファイルを指定するか options.entry_points セクションで指定する
  • 23. Preface setup.cfg pyproject.toml conclusion entry_pointsのファイル [console_scripts] hello = sample:hello
  • 24. Preface setup.cfg pyproject.toml conclusion options.entry_points での指定方法 [options.entry_points] console_scripts = hello=sample:hello
  • 25. Preface setup.cfg pyproject.toml conclusion pbrとの違い • pbr は setuptools の拡張 • openstack プロジェクトがパッケージングのために作成 した • setup.cfg にメタデータを記述する • その他 git タグによるバージョニングなど • setup.cfg の項目がちょっと違う
  • 26. Preface setup.cfg pyproject.toml conclusion バージョンをgitタグから自動で設定したい setuptools_scm を使うと git タグからバージョンを生成で きる setup( name="example", setup_require=["setuptools_scm"], use_scm_version=True, )
  • 27. Preface setup.cfg pyproject.toml conclusion setup.cfgでsetuptools_scmを試してみる version = attr:setuptools_scm.get_version • callable を指定すると評価結果がバージョンになる • 実行時に setuptools_scm が入ってないといけない • setuptools_scm が必要だということは setup_requires で指定できるが…
  • 28. Preface setup.cfg pyproject.toml conclusion setup.cfg の setup_requires • setup.cfg に書いたのではもう遅い • setup 関数に書くしかない? setup(setup_requires=["setuptools_scm"])
  • 29. Preface setup.cfg pyproject.toml conclusion setuptoolsの機能追加や拡張など • setuptools のバージョンが古いと setup.cfg の機能が使 えない • ユーザーの setuptools のバージョンは不確定 • setup_requires のタイミングは微妙 • 結局 setuptools の実装に頼っている部分があまり明確に なってない
  • 30. Preface setup.cfg pyproject.toml conclusion build-system • setuptools 以外のビルドツールを指定できる • setuptools を使う場合でも必要な拡張やバージョンを指 定できる
  • 31. Preface setup.cfg pyproject.toml conclusion PEP 518 • pyproject.toml でビルドツールを指定する • 存在しなければ今までの setuptools によるビルド
  • 32. Preface setup.cfg pyproject.toml conclusion pyproject.toml の形式 ビルドツールに flit を使う場合の例 [build-system] requires = ["flit"] backend = "flit.buildapi"
  • 33. Preface setup.cfg pyproject.toml conclusion ビルドツールの実装について • PEP516 • コマンドラインでの実装 • reject されました • PEP517 • API での実装 • 議論中
  • 34. Preface setup.cfg pyproject.toml conclusion PEP517で定義されてるAPI • build_wheel • build_sdist • optional get_requires_for_build_wheel • optional prepare_metadata_for_build_wheel • optional get_requires_for_build_sdist
  • 35. Preface setup.cfg pyproject.toml conclusion pipのPEP518,PEP517対応 • pyproject.tom の読み込み [PEP518] はマージされている • setup_requires の問題は解決できそう • 隔離された環境での wheel 生成 • まだツールは setuptools 固定 [PEP517 未対応]
  • 36. Preface setup.cfg pyproject.toml conclusion flit: setuptools以外のパッケージングツール • flit は setuptools とは別のパッケージングツール • filit.ini でメタデータを書く • シンプル
  • 37. Preface setup.cfg pyproject.toml conclusion flit を使うには $ pip install flit $ flit init $ flit wheel
  • 38. Preface setup.cfg pyproject.toml conclusion flit の PEP517対応 • toml-config ブランチ • flit.buildapi
  • 39. Preface setup.cfg pyproject.toml conclusion flitを使うべきか? • pip の対応ができてないと sdist としてインストールで きない • wheel だけで配布するというのなら今からでも可能 • setuptools 自体も setup.cfg への移行など進んでる • 個人的にはオルタナティブなツールは歓迎だが、使う かっていうと…
  • 40. Preface setup.cfg pyproject.toml conclusion 話し足りないこと • プライベートパッケージリポジトリ • Windows での C 拡張 • pip へのコントリビュート • conda2wheel
  • 41. Preface setup.cfg pyproject.toml conclusion まとめ • setuptools ちょっとだけ進化 • sdist から wheel を作る流れが PEP で定義される • setuptools 使わなくてもよい未来