SlideShare a Scribd company logo
パッケージングの
今と未来
aodag - Atsushi Odagiri
PyCon APAC 2013
お前誰よ
aodag 小田切篤 Atsushi Odagiri
Be Proud, Inc.
pylonsproject.jp
Pythonは10年ほど使わせていただいております
Agenda
パッケージングの基礎知識
パッケージングの今
パッケージングの未来
まとめ
パッケージングの基礎知識
なぜパッケージングするのか?
Pythonでのパッケージング
なぜパッケージングするのか?
● 作ったものを誰かに使ってもらう
● 誰かが作ったものを使う
素朴な方法
hello.pyを渡して
python hello.py
distutils
setup.pyにパッケージ情報を書く
python setup.py sdist でソースパッケージ作成
python setup.py install でパッケージインストール
パッケージングの今
Pypaツール群
setuptoolsベースのパッケージング
Pythonパッケージ開発の流れ
Pypa Python Packaging Authority
パッケージング関連の重要なツールをメンテナンス
する非公式なグループ
なぜかリポジトリがgithubとbitbucketにわかれてい
る
github pip virtualenv
bitbucket setuptools pypi distlib
モダンなPythonの環境作り
Pypaツール群
● virtualenv
● setuptools
● pip
virtualenvは環境作成時にsetuptools,pipがそ
ろった環境にしてくれる
pip
パッケージインストーラー
sdistしか扱えない(状態が続いていた)
さまざまなロケーションからインストール
pip install パッケージ名
pip install パッケージURL
pip install vcs{git,hg..}+リポジトリURL@チェンジ
セット
pip
requirements.txtにパッケージを全部指定
pip install -r requrements.txt
パッケージを削除
pip uninstall spam
pip
easy_installとは
なんだったのか?
setuptools/distribute
setup.pyを強化
配布するまでのコマンド
setup.py test
setup.py register
setup.py sdist bdist_egg upload
setup.py upload_docs
setuptools/distribute
pkg_resources
● パッケージのメタデータを利用するためのライブ
ラリ
● パッケージに含まれるメディアデータの取得など
● entry_point(後述)のローディングなども行える
setuptools/distribute
setuptoolsとdistributeの関係
setuptoolsがあまり更新などしない
distributeがフォーク
distributeがpy3対応などいろいろ
2013 PyCon USでマージ宣言 Pypaがメンテする
distributeコードベースでsetuptools-0.7など
setuptools-0.8,0.9,0.9.1...0.9.8,1.0,1.1,1.1.5
setuptools
distributeのことは
忘れてあげてください
setuptools
マージ後のsetuptoolsは
バージョンあげすぎです><
setuptools/distribute
packages=find_packages()
packagesに自分でパッケージを羅列しなくてもよい
install_requires, tests_require, extras_require,
setup_require
ライブラリの依存性を指定
setuptools/distribute
entry_point
プラグインの仕組み
CUIコマンドを作る例
entry_point={
“console_scripts”: [
“hello=hello:greeting”,
],
}
entry_point活用例
PasteDeploy
nose
cliff
setuptoolsのサブコマンド
egg
バイナリパッケージ
C拡張などのコンパイル済ライブラリなどを含める
ソースとメタデータをzipアーカイブしたもの
PIPでは扱えない
egg-info
pyramid-1.5a1-py33.egg-infoの例
● PKG-INFO
● SOURCES.txt
● dependency_links.txt
● entry_points.txt
● not-zip-safe
● requires.txt
● top_level.txt
PyPI
パッケージを登録して配布するサイト
pipやeasy_installはデフォルトで、PyPIにパッケー
ジを探しに行く
pip,setuptools,virtualenvでの開発
仮想環境作成と利用
mkdir yourproject
cd yourproject
virtualenv env
. env/bin/activate
or
env/scripts/activate.ps1
pip,setuptools,virtualenvでの開発
プロジェクトのディレクトリ構成
yourproject/
┣ env/
┣ setup.py
┣ setup.cfg
┣ docs/
┗yourproject/__init__.py
┗main.py
最小限のsetup.py
from setuptools import setup, find_packages
setup(name=”yourproject”,
packages=find_packages(),
)
実用的なsetup.py
from setuptools import setup, find_packages
setup(name=”yourproject”,
packages=find_packages(),
install_requires=[“webob”],
tests_require=[“testfixtures”],
test_suite=”yourproject”,
)
pip,setuptools,virtualenvでの開発
開発対象のegg登録と依存ライブラリインストール
(Editable Install)
pip install -e .
pip,setuptools,virtualenvでの開発
テストから、PyPIへのアップロード、PythonHosted
へのドキュメントアップロード
python setup.py test
python setup.py egg_info
python setup.py check
python setup.py register
python setup.py sdist bdist_egg upload
python setup.py build_sphinx
python setup.py upload_docs
extras_requireを活用する
setup(
…
extras_require={
“testing”: tests_require,
“docs”: docs_require,
“dev”: tests_require + docs_require,
}
)
extras_requireを活用する
extrasを指定してEditable Install
pip install -e .[dev]
setup.cfg
devパッケージ
[egg_info]
tag-build = dev
sdistやbdist_eggなどで生成されるパッケージの
バージョンの後にdevが付加される
setup.cfg
コマンドのオプションを指定
[upload_docs]
upload_dir = docs/build/html
python setup.py upload_docs で自動でオプショ
ン追加
setup.cfg
コマンドを追加(alias)
[aliases]
release = egg_info -RDb ''
source = register sdist binary
binary = bdist_egg upload --show-response
python setup.py release source
パッケージングの未来
関連PEP
wheel
distlib
Metadata 2.0
pip
インストーラー
easy_installsetup.py install
distutils
パッケージャー
setuptools/distribute
パッケージフォーマット
sdist
egg
Metadata1.0
wheel
Metadata2.0
?
pkg_resources(setuptools)
ユーティリティモジュール
distlib
今 未来
関連PEP
PEP 345 -- Metadata 1.2
PEP 376 -- Database
PEP 386 -- Version
PEP 420 -- Namespace Package
PEP 426 -- Metadata 2.0
PEP 427 -- Wheel
PEP 440 -- Version
PEP 453 -- Bundle PIP Installer
Wheel
● バイナリパッケージフォーマット
● Metadata 2.0を含むzip
● 電子署名可能
● bdist_wheelやegg2wheel, distlib.wheelなど
で作成
● C拡張などを含まない場合はpy2,py3両用のユ
ニバーサル構成可能
● 既にpipもサポート開始
● PyPIは?
distlib
● 関連PEPの実装ライブラリ
● PyPIへのアクセスAPI
● パッケージ同梱のメディアファイルへのアクセス
● Scriptsのインストール
● 機能検証用にdistilというコマンドがある
Metadata 2.0 pydist.json
● egg-infoでばらばらだった項目(requires,
entry_point)とMetadata1.0(PKG-INFO)を統合
● josnフォーマット
● wheelの dist-info に配置する
pkg_resourcesからdistlibへ
● だいたい同じことができる
● entry_pointとexportsで非互換性がある
setuptoolsのwheel対応
setuptools自体はdistlibもwheelも対応していない
wheelをインストールすると、setupにbdist_wheel
コマンドが追加される
pipのwheel対応
● distlibを同梱して、wheelパッケージをインス
トール可能
● sdistに対してbdist_wheelする実装が既に取り
込まれている(インストールはしない)
● 直接sdistをインストールする場合は bdist_egg
が実行される
Wheelをどう使うか?
例:Webアプリケーションのデプロイ
アプリサーバーにgccがない!Pillowをどうインス
トールするか?
wheelで作成してアプリケーションサーバーに配布
する。
pipでwheelをインストール(pipはeggパッケージを
取り扱えない)
開発マシン
パッケージサーバー
ステージングサーバー
プロダクションサーバー
リポジトリ
CIサーバー
ソースコード
sdist
wheel
requirements.txt
wheel
議論中の話題
● sdistをインストールする際に、setup.py
bdist_eggは必須か?
● パッケージャーがwheelを作成するのをサポート
するツールは?
○ bdist_wheelはsetuptoolsとwheelが必要
○ sdist.wheelはpydist.jsonを自分で書く
○ bentoは独自形式のmetadataファイルから変換する
● 各Linuxディストリビューションの反応、作業はど
のようになるか?
まとめ
● 今はsetuptoolsの使い方とsetup.pyの書き方を
ちゃんと覚えよう
● pipはがんばってpepに追従しているので今後も
安泰に見える
● setuptoolsはいい加減にしてほしい
● wheelはデプロイで活用できるかも
参考文献
● Distributing Python Modules
● Python Packaging User Guide
● Wheel
● distlib
● setuptools
● pip
● Bento
● pypa bitbucket
● pypa github

More Related Content

パッケージングの今と未来