パッケージングの今と未来
aodag
お前だれよ?
aodag = Atsushi ODAGiri
株式会社ビープラウド勤務
Pylonsproject.jp
Pythonサポーターズ
PyCon APAC 2013 パトロン
お前だれよ?(cont)
python1.5から!
文字列処理とか秘密の道具
Zope, TurboGears, Pylons/Paste/WSGI,
Repoze, Pyramid!
Django?なにそれ?
PythonのWebフレームワークってどのくらいZope
にするかってことだよね?
あじぇんだ
● パッケージングの今
● パッケージングの未来
● Python3.4に期待されること
ヽ(´_・ω・)_
こわくないよ
現在のツール
● distribute
○ setup.py
○ pkg_resources
○ egg
● virtualenv
● pip
what's setup.py?
配布物を作る、PYPIに登録やアップロードする、配
布物をインストールする
$ python setup.py test build sdist register
upload
$ python setup.py install
what's setup.py? (cont)
標準ライブラリ distutils
distutils.core.setup
拡張 setuptools/distribute
setuptools.setup
パッケージメタデータ 1.0
setup関数で作成
パッケージ名
バージョン
作成者、メンテナ
など
基本的な情報
egg-info
依存ライブラリ
プラグインのエントリポイントなど
拡張されたメタデータ
仮想環境の今の使い方
● virtualenvで仮想環境作成
○ virtualenvwrapperはそこそこ便利
● pipでパッケージインストール
$ mkvirtualenv some-project
(some-project) $ pip install pyramid
(some-project) $ pip freeze
helloコマンドの作成とパッケージング
$ mkvirtualenv hello
(hello) $ pip install pastescript
(hello) $ paster create hello
(hello) $ cd hello
(hello) $ pip freeze
(hello) $ pip install -e .
hello-0.0dev
hello/__init__.py
def hello():
print "Hello, world!"
hello/__main__.py
from . import hello
if __name__ == '__main__':
hello()
(hello) $ python -m hello
Hello, world!
メタデータ
(hello) $ python setup.py egg_info
(hello) $ cat hello.egg-info/PKG-INFO
(hello) $ cat hello.egg-info/entry_points.txt
console_scripts
setup.py
entry_points="""
[console_scripts]
hello=hello:hello
"""
(hello) $ pip install -e .
(hello) $ hello
Hello, world!
パッケージング
(hello) $ python setup.py sdist
(hello) $ ls dist
hello-0.0dev.tar.gz
公開(without PyPI)
bitbucketなど用意
例えば https://bitbucket.org/aodag/python-hello
$ hg init
$ hg add setup.py setup.cfg hello/__init__.py
hello/__main__.py
$ hg commit
$ hg push
リリース
リリースブランチ
$ hg branch rel-0.1
setup.cfg
;tag_build = dev ; コメントアウト
setup.py
version = "0.1"
リリース
$ hg commit
$ hg tag hello-0.1 # egg name
$ hg push --new-branch
https://bitbucket.org/aodag/python-
hello/get/hello-0.1.zip
インストールしてみよう
$ mkvirtualenv hello2
(hello2) $ pip install https://bitbucket.
org/aodag/python-hello/get/hello-0.1.zip
(hello2) $ pip freeze
パッケージングの未来
現在の問題点
● eggは標準じゃない
● eggはpure pythonのパッケージでもプラット
フォーム、pythonバージョンごとに作成
● setup.py には実際のところなんでも書けてしま
う
● Linuxディストリビューションなどのパッケージ管
理と競合する
packaging
python3.3に入る予定だった
setuptoolsなどの成果を標準化することが期待さ
れていた
entry_pointやscriptsなどの拡張性について議論し
きれてなかった
実装もなかなか進まなかった
python3.3からdrop
パッケージインストールデータベース
PEP376
配布物に含まれるファイルを追記
どのインストーラ(pipやdpkg,rpmなど)がインストー
ルしたのか?
ユーザーが指定したのか、依存関係の結果インス
トールされたのか?
などを記録
wheelパッケージコンテナ PEP427
eggから発展
パッケージインストールデータベースに対応
より柔軟なプラットフォーム対応
きちんとPEPで議論済
メタデータ2.0 PEP426
egg-infoなどから、追加項目
依存ライブラリや提供パッケージなど。
setuptoolsとdistributeが合流
setuptoolsがあまりにも更新やバグフィックスが遅
い
distributeにフォーク
distributeで2to3やpython3対応などが進む
setuptools0.7でdistributeが合流、成果をマージ
distribute0.7はsetuptools0.7以降へのアップグ
レード用
pypa
setuptools, pip, virtualenvなどの実装、メンテナン
スをするグループ
http://github.com/pypa
http://bitbucket.org/pypa
distlib/distil
distlib
パッケージング関連のPEPを実装
distil
distlibの機能をpipにマージするための実験的実
装
distlibのサポートPEP
database PEP376
metadata 2.0, 1.2, 1.1 PEP345,314,241
version PEP386,426
Wheel PEP427
現在の状況
pip
pip1.4でwheelに対応
setuptools
setuptools0.8で2to3を必要としなくなった ->
wheelにできるようになる
virtualenv
setuptools0.7以降に対応
残る問題
メタデータ2.0
distlibはメタデータ2.0をサポートしているが
pypackage.jsonを書かないといけない
bdist_wheelはsetup.pyからメタデータを生成する
が、対応しているのはメタデータ1.0
pyvenv
virtualenvの機能をPython標準にとりこみ
Python3.3以降で利用可能
virtualenvが標準ライブラリをコピーするのに対し
て、pyvenvはsite.pyの入れ替えのみで対応
未来を感じてみよう
Python3.3は入ってますよね?
$ mkdir hello33; cd hello33
$ pyvenv env
$ . env/bin/activate
(hello33) $ wget https://bitbucket.
org/pypa/setuptools/downloads/ez_setup.py
(hello33) $ wget https://raw.github.
com/pypa/pip/master/contrib/get-pip.py
Don't think FEEL
$ pip install -U setuptools==0.8
$ pip install -U https://github.
com/pypa/pip/archive/1.4rc2.tar.gz
$ pip install wheel
準備完了
wheeling!
C拡張あり
$ pip wheel Pillow
$ ls wheelhouse
Pillow-2.1.0-cp33-cp33m-linux_x86_64.whl
C拡張なし
$ pip wheel webob
$ ls wheelhouse
WebOb-1.2.3-py33-none-any.whl
use it!
インストールして使う
$ pip install wheelhouse/WebOb-1.2.3-py33-
none-any.whl
マウントして使う
import distlib.wheel
distlib.wheel.Wheel('wheelhouse/Pillow-2.1.0-
cp33-cp33m-linux_x86_64.whl')
import PIL
Python3.4に期待すること
pipをインストールするスクリプトをバンドル
distlibを標準ライブラリにとりこみ
心配事について
ツールは変わる?
pipは続投されるはず
setuptoolsは一部の機能をdistlibに任せるように
なるはず
パッケージング方法は変わる?
bdist_wheelがメタデータ2.0をサポートすれば、現
在のsetup.py方式のままいけるはず
まとめ
パッケージングの情報は分散していてわかりにくい
今後のパッケージング方法はPython3主体
Python2の間はsetuptoolsがわかればOK
公開しない場合でもsetup.py書こう

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