2009/12/05 distutils, setuptools, distribute, pip, virtualenv, buildout

Category: 'Zope', 'python', 'Plone'

今日は (第6回)Zope/Plone開発勉強会 に参加しています。

勉強会中に、結局eggって何?buildoutを使えるようになるにはどうすればいいの?最近たまに聞くpipって何?という質問が出たので、 distutils, setuptools, distribute, pip, virtualenv, buildout について、そろそろ整理しておこうかなーと思ってまとめてみました。

各パッケージの用途と概要

distutils:Python の標準パッケージです。eggは作れませんが、 python setup.py build したり、 python setup.py install したりの機能が提供されています。詳しくは Pythonのマニュアル を参照のこと...。
setuptools:

setuptools はPython 標準の distutils を拡張しています。

良く使われるのは easy_install コマンドで、 easy_install を使うために ez_setup.py を実行すると、陰でこっそり setuptools がインストールされます。 easy_install は easy_install Sphinx 等と書くと、PyPI(Python Package Index)から自動的に Sphinx パッケージを探してきて site-packages にインストールしてくれます。

開発向けには、setuptoolsをインストールすると setup.py に egg を作るための記述が出来るようになり、また、 python setup.py bdist_egg で egg を作れるようになったり、 python setup.py register ... でPyPIに登録出来るようになったりします。

現在の開発状況は、0.6c11 (2009-10-20) までリリースされていますが、 0.6c9 (2008-09-24) から 0.6c10 (2009-10-19) まで1年以上間が空いていて、6個のバグが修正されただけで、実質、開発が止まっているといえるかもしれません。

distribute:

distribute は setuptools から分岐したプロジェクトです(というかクローンです)。 distribute は将来的に setuptools から置き換えて使えるように設計しています。また、0.6.2までで既存の setuptools との後方互換性対応が完了し、同時に Python3 への対応を始めました。

distribute をインストールすると、 setuptools がインストール済みの場合、自動的にこれが使われないようにリネームします。インストールされた distribute-0.6.8-py2.6.egg の中には setuptools というパッケージ名が入っているので(と言うか名前なども全部互換なので)、これ以降 import setuptools 等と実行すると、distributeのコードがimportされるようになります。

bin/easy_install も distribute を使うように書き換わります。

Tarek の blog virtualenv and zc.buildout now with Distribute included から引用:

Setuptools から Distribute に切り替えるとてもシンプルな理由:

  • Distribute 0.6.x は Setuptools の完全互換性を持っています
  • Distribute は活発にメンテナンスされており、10人以上のコミッターがいます
  • Distribute 0.6.x は Python3 をサポート!

合わせて読みたい: Distutils and Distribute status (part #1)

pip:

pip は easy_install と同様の機能を提供します。 distribute は setuptools 全体を置き換えようとしていますが、 pip は easy_install コマンドを置き換えようとしています(distribute とは異なり、easy_installを削除したり書き換えたりはしません)。

pip は easy_install でインストール出来るものは同じようにインストールできます。パッケージ名を指定すれば自動的に PyPI から取ってきてくれたりします。ただし、 easy_install よりも良い動作をするよに設計されていて、複数パッケージを逐次インストールせずに、先にダウンロードしてからインストールを始めるとか、エラーメッセージが親切だとかが考慮されています

pip の方針として、複数バージョンの共存は行わない設計のため、 pip でインストールする場合は virtualenv の環境下で行うことが推奨されています。なお、 pip install -E new-env/ MyPackage と実行すれば任意の virtualenv 環境をインストール先に指定できます。また、間違って実環境下で pip install してしまわないように環境変数 PIP_REQUIRE_VIRTUALENV=true しておく方法も提供されています。

pip の便利な機能は, uninstall(パッケージのアンインストール), freeze(パッケージ名==Version番号、の羅列がstdoutに表示されます), bundle(対象パッケージがrequireしているパッケージを集めて1つの .pybundle ファイルに固めてくれる) などがあります。 .pybundle に固めたファイルは pip install foo.pybundle としてインストール出来ます。ソースが全て .pybundle に格納されているためこのとき通信出来なくても問題ありませんが、C拡張などはこの時点でビルドされるためコンパイラや関連ライブラリなどが必要になります。

現在の所、制限事項も多く、eggパッケージからのインストールは出来ず、ソース提供されているパッケージのみインストール出来るなどがあります(=バイナリ配布出来ません)。Windowsではテストされておらず、ちょっとしたバグのためにbundleが動作しません。またWindowsでちょっと試してみたところ、C拡張のビルド時にコンパイルエラーになってもインストールが継続してしまうようです。詳しくは pip の Differences From easy_install の説明を確認して下さい。

非開発向けの視点からみると pip を使ったインストールはシンプルなので(単一バージョン,eggで固めず全て展開する,名前空間を結合する) 使いやすいという意見もあります。実際、setuptoolsの複数バージョン管理,egg化という複雑さや、jarっぽい設計よりも良いと評価している人もいるようです(Why I like pip)。

virtualenv:

VirtualEnv はPythonの仮想環境を作ります。それだけですが、非常に便利です。 virtualenvwrapper も合わせて使うと便利らしいです。 workingenv や virtual-python の後継という位置づけのようです。

virtualenv は標準で setuptools を取ってきてインストールしますが、 virtualenv --distribute envdir のようにして環境を作ると、 setuptools の代わりに distribute を使ってくれるようになります(環境を作ってから 'easy_install distribute` してもよいです)。

virtualenv を導入して困ることはほとんど無いと思います。 distribute, pip, buildout, どれもが virtualenv 下で問題無く動作します。ただし、 mod_python や mod_wsgi など、 virtualenv 環境下の bin/python 以外から virtualenv 下のモジュールを呼び出す場合、 Using Virtualenv without bin/python を参考に多少の設定を行う必要があります。

buildout:

zc.buildout は Python ベースのビルドシステムです。パーツという単位でアプリケーションを 作成、組み立て、配置などを行い、非Pythonベースのものも構築は可能です。

buildout 自体は buildout.cfg の設定を元に環境を構築してくれます。処理の実体は buildout 用の recipe と呼ばれるパッケージで実装されていて、PyPIからeggを取ってくる、svnからチェックアウトする、などいろいろなrecipeがあります。 Zope 用としては Zope のインスタンスを作成する、Ploneのサイトインスタンスを作ってProductsをインストールする、などの recipe もあります。

buildout では Python 本体の site-packages を切り離せないので、その必要がある場合は virtualenv 環境下で buildout を使うようにしましょう。

buildout 自体は recipe を取ってくるために setuptools を使っていますが、代わりに distribute を使うようにも出来ます (python bootstrap.py --distribute)。

詳しい使い方については buildoutで開発0: zc.buildout で環境を作る - 清水川Web を参照して下さい。

各パッケージの現状

distutils:
作者:Python コミュニティー
PyPI:Python同梱です
最新:Python-2.6.x 同梱
setuptools:
作者:Phillip J. Eby (PEAK)
PyPI:http://pypi.python.org/pypi/setuptools
最新:0.6c11 (2009/10/20)
更新頻度:
目的:distutilsの拡張, egg作成, PyPIからのインストール
弱点:メンテが止まっているように見える、進化がない。
distribute:
作者:Tarek Ziade
PyPI:http://pypi.python.org/pypi/distribute
最新:0.6.8 (2009/11/01)
更新頻度:
目的:distutils の拡張。 setuptools の完全置き換え、完全互換。Python3対応(今後)
相性:setuptools を使っているのと変わらない使用感。 setuptools を排除する以外はとても良い。 virtualenv や buildout で最初から distribute を使うためのオプション(--distribute)が提供されている。
pip:
作者:Ian Bicking
PyPI:http://pypi.python.org/pypi/pip
最新:0.6.1 (2009/11/20)
更新頻度:
目的:easy_install コマンドの置き換え、uninstallサポート、bundleパッケージの作成。
弱点:eggをインストール出来ない。ソースからのみ可能。
相性:Windowsでは動作確認されてません(Maybe it doesn't work on Windows.)。実際、bundleコマンドはWindowsで動作せず。また、buildoutで構築した環境ではfreezeとuninstallも意味をなさないため、buildout使用時はpipの必要性が無いかも。
virtualenv:
作者:Ian Bicking
PyPI:http://pypi.python.org/pypi/virtualenv
最新:1.4.3 (2009/11/20)
更新頻度:
目的:Pythonの仮想環境を作成。site-packagesの切り離し。
相性:とくに競合するパッケージは無し。distributeをデフォルトにするオプション --distribute あり。
buildout:
作者:Jim Fulton, Andreas Jung, Tarek, Tres Seaver, tlotze
PyPI:http://pypi.python.org/pypi/zc.buildout
最新:1.4.2 (2009/11/01)
更新頻度:
目的:環境やアプリケーションの構築を行う。egg取得、配置、設定、shellコマンド実行...等々。JavaならMavenに相当するらしい。
相性:virtualenv 無しで独立した環境を構築するが、virtualenv環境下で使うとさらにクリーンに使える。競合はしていない。distributeをデフォルトにするオプション --distribute あり。

調べてみた感想として、個人的には virtualenv + distribute 環境下で buildout + distribute を使うのが良いように思います。pipはbuildout環境下では積極的に使う必要はなさそう。pipにバイナリインストール機能が提供されてもうちょっと安定したら(開発以外の用途で)使いたいシーンが出てくるかもしれません。