パッケージングを支える技術 pyconjp2016

840 views

Published on

pycon jp 2016 発表資料

Published in: Software
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
840
On SlideShare
0
From Embeds
0
Number of Embeds
113
Actions
Shares
0
Downloads
5
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

パッケージングを支える技術 pyconjp2016

  1. 1. 2016年9月21日 パッケージングを支える技術 PyCon JP 2016 Atsushi Odagiri
  2. 2. 1 お前だれよ • 小田切篤 • Beproud, Inc.
  3. 3. 2 これまでのお話 • 2013 パッケージングの今と未来 • 2014 パッケージングの今 • 2015 Packaging最前線
  4. 4. 3 アジェンダ • パッケージングを支えるツール • ソースパッケージ • バイナリパッケージ • パッケージングを支える技術に支えられてみ よう
  5. 5. 4 パッケージングを支える ツール • PyPA ってなに?
  6. 6. 4.1 PyPA • Python Packaging Authority • パッケージングツールをメンテするグループ • github.com/pypa • bitbucket.org/pypa
  7. 7. 4.2 PyPAの基本ツール • setuptools • virtualenv • pip • wheel
  8. 8. 4.3 setuptools • 配布物を作成する • setup.pyで使われる • easy_install使うのはもうやめましょう • distributeも、いい加減忘れてください • egg? あれは幻です
  9. 9. 4.4 今日のsetuptools • 27.2.0 • 去年(2016/9/6)18.3
  10. 10. 4.5 virtualenv • python環境を仮想化する • プロジェクトごとに使うライブラリを隔離 • python3.3以降では同等の機能がpython本体か ら提供されている(pyvenv)
  11. 11. 4.6 pip • インストーラ • sdistとwheelを取り扱える • requirements.txt でライブラリを構成管理する
  12. 12. 4.7 wheel • wheel形式パッケージを作成するツール • setuptools に bdist_wheel サブコマンドを追 加する
  13. 13. 4.8 ツールの導入方法 • python3.4以降ではpip,setuptoolsを導入する ensurepipが入っているのでpythonインストー ル後にpipを利用可能 • virtualenvは環境作成時にpip,setuptools,wheel を導入する • pyvenvはバージョンによって作成後のツール 導入が異なる – 3.3 なし – 3.4以降 ensurepipでpip,setuptoolsが導入さ れる
  14. 14. • どの環境でもget-pip.py で pip,setuptools,wheelを最新にできる
  15. 15. 4.9 例えばubuntuのpyvenv • 14.04 の python3.4 は ensurepipが消されてい るため、–without-pipをつけないとエラーに なる • 16.04 の python3.5はensurepipが pkg_resources-0.0.0という謎のパッケージメ タデータを作成する – そのままpip freezeしたrequirements.txtを 作ると他の環境でエラーになる • 回避策は –without-pip で環境を作ってから get-pip.py でツールを導入する
  16. 16. 5 python標準の仕組み • pypaツールはどのようにパッケージをインス トールしてpythonインタプリタに認識させる のか?
  17. 17. 5.1 PYTHONPATHとsys.path • 環境変数PYTHON_PATHで複数のディレク トリを指定できる • 指定した内容は ‘sys.path‘ に入る • モジュールやパッケージを ‘import‘ するとき は ‘sys.path‘ のディレクトリを探しに行く • よくわからないところにインストールしても sys.path に追加できればよい
  18. 18. 5.2 site-packages/user-site-packages • サードパーティ製ライブラリの標準インストー ル先 • debianではさらに dist-packages という謎の ディレクトリが存在する • user-site-packages はユーザー権限でインス トールできる • user-site-packages にインストールするには pipで ‘–user‘ オプションを使う
  19. 19. 5.3 .pth • site-packages などに配置されるファイル • 中にファイルパスを羅列しておくと、インタプ リタ起動時にすべて ‘sys.path‘ に追加される • ‘./‘ 以外で始まる行があるとpythonコードとし て実行されるという謎仕様 • easy_install が活用していた
  20. 20. 5.4 distutils • setup.py で使う setup 関数の大元 • setuptoolsはdistutilsの拡張 • 直接使うことはもうないはず • 昔はこれで setup.py install などとしていた
  21. 21. 6 バイナリディストリビュー ション wheel • wheelもう使ってるよね?
  22. 22. 6.1 PEP 427 – The Wheel Binary Package Format 1.0 • バイナリ形式の配布フォーマット • 既に利用されている • C拡張を含まない場合はpy2.py3で共通の配 布物
  23. 23. 6.2 PEP 513 – A Platform Tag for Portable Linux Built Distributions • これまではLinux向けwheelはpypiにあげられ なかった • manylinux1 • linux向けのwheelを作るために決められた
  24. 24. 6.3 Linux向けwheelパッケージのつら いところ • どのようなライブラリがあると想定してよ いか? • 依存するライブラリのABIが合わないなどのト ラブル • 依存ライブラリ同梱のためのハックがsetup.py に散らばる
  25. 25. 6.4 Python の ABI • pymalloc • ucs-4 • python3ではすべてucs-4ビルド
  26. 26. 6.5 wheelの名前規約からわかること • numpy-1.11.2rc1- cp35-cp35m-manylinux1_x86_64.whl – numpy という名前のパッケージ – 1.11.2rc1 というバージョン – CPython 3.5 のAPI – CPython pymallocビルドのABI – manylinux1_x86_64 プラットフォーム
  27. 27. 6.6 manylinux1が想定するLinux環境 • Centos5.11相当 • x86とx86_64の両方 • その他前提としてよいライブラリ
  28. 28. 6.7 manylinux1でインストールを期待 してよいライブラリ(1) • libpanelw.so.5 • libncursesw.so.5 • libgcc_s.so.1 • libstdc++.so.6 • libm.so.6 • libdl.so.2 • librt.so.1 • libcrypt.so.1 • libc.so.6
  29. 29. • libnsl.so.1
  30. 30. 6.8 manylinux1でインストールを期待 してよいライブラリ(2) • libutil.so.1 • libpthread.so.0 • libX11.so.6 • libXext.so.6 • libXrender.so.1 • libICE.so.6 • libSM.so.6 • libGL.so.1 • libgobject-2.0.so.0
  31. 31. • libgthread-2.0.so.0 • libglib-2.0.so.0
  32. 32. 6.9 auditwheel • linux向けwheelをmanylinux1に変換する ツール • manylinux1を満たしているかチェック • 依存ライブラリをwheelに同梱させる • wheelファイル名のplatform tagをmanylinux1 に変更
  33. 33. 6.10 dockerを利用してパッケージを作 成する • docker イメージが用意されている – quay.io/reposi- tory/pypa/manylinux1_x86_64 • CIでこのイメージを利用してパッケージング する – werckerやgitlabでは直接dockerイメージを 利用できる – travisなどでもCIのワークフロー中にdocker イメージを利用できる
  34. 34. 6.11 werckerでやってみよう box: id: quay.io/pypa/manylinux1_x86_64 registry: quay.io build: steps: - script: name: build code: | /opt/python/cp35-cp35m/bin/pytho - script:
  35. 35. name: test code: | /opt/python/cp35-cp35m/bin/pytho - script: name: pack code: | /opt/python/cp35-cp35m/bin/pytho - script: name: audit code: | auditwheel repair dist/*.whl -w
  36. 36. 7 ソースディストリビューショ ン sdistとはなにか? • setuptoolsとpipの実装でなんとなく決まって いる • ‘setup.py install‘ ができればsdist?
  37. 37. 7.1 setuptoolsがなくてもwheelパッ ケージは作成できる • wheelツールはsetuptoolsと独立して作られて いる • distlibにもwheelを作成する処理が実装されて いる
  38. 38. 7.2 sdistを考え直す意味 • setuptools依存からの脱却 • 明確なインストールフロー
  39. 39. 7.3 現状のインストール手順 • pipがsdistをダウンロードする • pipがsdistを展開する • pipがsetup.py bdist_wheelを実行する • できあがったwheelパッケージをpipがインス トールする • setup.py install は関係なかった
  40. 40. 7.4 PEP 518 – Specifying Minimum Build System Requirements for Python Projects • パッケージング方法やそれに必要なツールを支 持する • pypi上でwheel作成する目的? • パッケージングに必要なツールを記述 • pyproject.toml • TOMLフォーマット
  41. 41. 7.5 pyproject.toml [build-system] requires = ["setuptools", "wheel"]
  42. 42. 7.6 PEP 516 – Build system abstraction for pip/conda etc • ビルドツールの指定や依存性を記述する • 指定のツールでどのようにビルドするのかも 指定 • pypi.jsonというファイルで話が進んでいるっ ぽい • でも多分pyproject.tomの tool セクションが同 じものを指しているはず
  43. 43. 8 プログラミングPythonパッ ケージ • setuptoolsに依存せずにパッケージングしてみ よう
  44. 44. 8.1 distlibでできること • wheelパッケージ作成 • wheelパッケージインストール • メタデータ作成 • パッケージリポジトリからのダウンロード • インストール済パッケージのリストアップ
  45. 45. 8.2 bib - reversed pip • distlibと標準ライブラリのみで実行するパッ ケージングツール • 本日作成しました
  46. 46. 8.3 distlibを使う準備 >>> import sys >>> import os >>> sys.path.append( ... os.path.join( ... os.getcwd(), ... ’distlib-0.2.3-py3-none-any.wh >>> import distlib >>> distlib
  47. 47. 9 プロジェクトの作成 • bib.init_project
  48. 48. 9.1 パッケージメタデータ • dist-info ディレクトリ • pydist.json/package.json
  49. 49. 10 パッケージの作成
  50. 50. 10.1 wheelパッケージを作成する • 作業ディレクトリを作成 • パッケージ名.dist-info ディレクトリを作成 • dist-info ディレクトリ以下に pydist.json をコ ピー • インストール対象を作業ディレクトリにコピー • distlib.wheelでWheelを作成する
  51. 51. 11 パッケージの配布 • 作成したパッケージを公開してインストール可 能にする • simple package repository形式のサイトで公開 する • ダウンロードしてインストールする
  52. 52. 11.1 PEP 503 – Simple Repository API • pypiもこの形式 • 登録やアップロード方法は決められてない • ‘httplib.server‘ などでも実現可能
  53. 53. 11.2 wheelファイルをsimple package repository形式に配置する • distlib.wheelでメタデータを取得 • パッケージ名でディレクトリを作成 • wheelファイルをコピー • そのディレクトリを対象に ‘httplib.server‘ を 立ち上げる
  54. 54. 12 インストール • パッケージをリポジトリからダウンロード • パッケージのメタデータを読み取る • Wheelで読み取って、対象ディレクトリにイン ストール
  55. 55. 12.1 パッケージをリポジトリからダウ ンロードする • distlib.locators • SimpleScrapingLocator • result.download_urls でURLを取得 • 一時ディレクトリに保存
  56. 56. 12.2 wheelパッケージをインストール する • distlib.scripts ScriptMakerを作成 • distlib.wheelの install メソッドでインストール
  57. 57. 12.3 インストール一覧 • PEP 376 – Database of Installed Python Distributions • パッケージによってインストールされたファイ ルの情報 • どのモジュールがどのパッケージでインストー ルされたか • インストール時のファイルのハッシュ • distlib.database
  58. 58. 13 まとめ • setuptoolsやpipがなくてもパッケージングは できる • いろんなツールがエコシステムに参加できるよ うにsdistの定義が検討されている • wheelはがんがん使いましょう

×