PyCon APAC 2013参加レポート

第2回 Pythonによる開発運用を助けるツールたち ─パッケージシステム,DataDogでモニタリング,mockを使ったテスト

この記事を読むのに必要な時間:およそ 8 分

PyCon APAC参加レポート第2回は,初日の日本語セッションを中心にまとめたいと思います。1日目と2日目のキーノートは第1回の記事にまとめてありますのでお読みください。

パッケージの未来

1日目の一番初めのセッションは,@aodag(小田切 篤)さんによるパッケージの未来に関するお話です。このセッションは,Pythonに10年間お世話になっているというaodagさんが,これまでのPythonのパッケージ管理システムの歴史とPython 3のパッケージ管理システムについて語るというもの。セッションではさらにその先に関する発表もありました。

画像

今までのパッケージングシステム

Pythonのパッケージングシステムの歴史は複雑で,これまでパッケージングの補助ツールとして二系統が存在していました。

  • distribute
  • setuptools

またパッケージのインストールには以下のコマンドを使用します。

pip
サードパーティのパッケージインストーラ
easy_install
distribute/setuptoolsに含まれるインストールコマンド

標準で入っているdistutilsもあるのですが,これだけでは機能が足りたいため,パッケージングにはサードパーティによる上記のツールを活用します。もし,これらのツールを使わない場合,以下のようなコマンドを使ってパッケージングする必要があります。

python setup.py sdist    # ソースパッケージの作成
python setup.py install  # パッケージインストール

また,パッケージに関して重要なツール群を管理しているPypa(Python Packaging Authority)団体があり,この団体は以下のツール群を管理しています。

  • virtualenv:仮想環境の構築
  • pip:パッケージインストーラ
  • setuptools:パッケージ作成の補助ツール

これらはGithubとBitbucketにリポジトリが分かれているので,ソースコードを探すには注意が必要です。

easy_installとpip

パッケージのインストール方法について,ライブラリのドキュメントによっては

easy_install [package_name]

と書いてあったり,

pip install [package_name]

と書いてあったりします。

これらの違いは,pipがパッケージのインストールを補助するライブラリで,easy_installはdistribute/setuptoolsについてくる単純なインストールコマンドだという点にあります。pipのほうが高機能でさまざまなことができます。

pip install [package_name]
# パッケージのインストール(デフォルトではPyPIからダウンロードしてきてインストール)

pip install [package_url]
# 特定URLから直接インストール

pip install [vcs{git,hg,...}+[repository_url]@[change_set]]
# GitやMercurialのリモートリポジトリから直接インストール

pip install -r requirements.txt
# requirements.txtに書かれたパッケージを全てインストール

pip uninstall [package_name]
# パッケージをアンインストール

easy_installとpipでパッケージがインストールされるディレクトリ等が異なってくるので,どちらか片方のみを使うほうが無難です。aodagさんからは「パッケージインストールには高機能なpipを使ってください。」との発言がありました。

virtualenvを使えば,環境構築時に自動でpipがインストールされます。

distributeとsetuptools

distributeとsetuptoolsは同じ役割を果たすライブラリですが,複雑な経緯から二系統存在しています。distributeはsetuptoolsからフォークされたプロジェクトで, "今まで" はdistributeがpython3対応などを積極的に行っていました。しかし,PyCon US 2013でマージ宣言され,distributeがsetuptoolsに取り込まれました。

マージ宣言されるまで,aodagさんをはじめとするパッケージング関連の話をする開発者は,

setuptoolsのことは忘れてあげてください

と話していましたが,これからは,

distributeのことは忘れてあげてください

となるとおっしゃっていました。

setuptoolsはマージ後に頻繁に更新されており,0.7から1.1.6にバージョンが大きく上がっています。setuptoolsを使うと,setup.pyに便利な機能が拡張されます。

setup.py test                    # ユニットテスト実行
setup.py register                # PyPIへの登録
setup.py sdist bdist_egg upload  # ソース配布物とegg形式の配布物をPyPIにアップロード
setup.py upload_docs             # ドキュメンテーションをPyPIにアップロード

その他,pkg_resourcesというモジュールが使え,パッケージのメタデータを読み込むことができます。以下のようにsetup.pyにentry_pointを指定し,コマンドの作成などに活用することができます。ここでは,find_packages()も活用し,自動でパッケージの読み出し(__init__.pyが含まれるディレクトリを検索して一覧化)⁠設定を行っています。

from setuptools import setup, find_packages

setup(name="yourproject",
      packages=find_packages(),
      entry_point={
          "console_scripts": [
              "hello=hello:greeting",
          ],
      })

これからのパッケージングシステム

画像

PythonはPEPという規約に従って仕様変更が行われていきます。パッケージングシステムについてPEPで議論されている部分とそうでない部分(あまり進んでいない部分)があり,上図のようにユーティリティモジュール,パッケージフォーマット,インストーラーについては議論が行われ,収束しつつあるようです。

パッケージに関連するPEPとして以下の8つが挙げられます。

  • 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

pipは先ほどの説明の通りで大きな変更はないようです。ここでは以下のWheel,distlib,pydist.jsonに関してまとめます。

パッケージフォーマット Wheel
新しいメタデータを含むzip形式のパッケージフォーマットです。電子署名も可能になっています。pipもサポートを開始しています。
ユーティリティモジュール distlib
pkg_resourcesからdistlibに変更され,今後はdistlibを使ってパッケージのメタデータにアクセスするようになります。pkg_resourcesとほとんど同じことができるようです。
メタデータ pydist.json
egg-infoでかなり適当に取り決められていた仕様がまとめられ,json形式でメタデータが扱いやすくなります。

今までまとまった情報のなかったパッケージ関連のシステムについて,その経緯から学べるセッションはとても有意義でした。最後は目下議論中の最近の話題にも触れ,トレンドを掴むこともでき,とても内容の濃いお話でした。Youtubeとスライドがアップされているので,このあたりをあまり理解できていない方は,ぜひ確認してみてください。

著者プロフィール

藤原敬弘(ふじわらたかひろ)

FULLER株式会社

1986年生まれ。北海道苫小牧市出身。苫小牧工業高等専門学校卒業。

Fuller, Inc. CTO

Webプログラマ,よく利用する言語はPython。Pythonコミュニティによく出没する。趣味でArduinoやRaspberry Piなどを使って,便利なものを自作する。

twitter:@wutali
github:https://github.com/wutali

バックナンバー

PyCon APAC 2013参加レポート

コメント

コメントの記入