A Way of Code

興味の赴くままに書き綴っていきます。

Mac OS X 10.7.3 Lionでpythonbrew, virtualenv, pip, buildoutなPython環境を構築する 第4回 hello, buildout

前回:http://toggtc.hatenablog.com/entry/2012/02/06/023807

今回は、前回構築した仮想環境を元に、buildoutを使ってみます。
buildoutはPythonのビルドシステムで、JavaでいうところのMavenに近いものです。必要なライブラリを指定しておけば、自動でダウンロードして環境を作ってくれる優れものです。
pythonbrew にはbuildoutコマンドが用意されているのですが、うまく動かなかったので、今回はzc.buildoutを直接使います。

1. buildoutのミニマムな手順

  1. プロジェクトディレクトリを作成する
    • 任意の名前でディレクトリを作ります。この中に、必要なライブラリや、開発するソースコード等々一式が格納されることになります。
  2. buildoutの初期セットアップ
    • プロジェクトディレクトリに対して、buildoutから初期セットアップをすると、buildout用のディレクトリやファイルが自動生成されます。
  3. buildout.cfgを作成する
    • 設定ファイルに依存するライブラリやらインストール手順やらを記述します。
  4. buildoutを実行する
    • buildout.cfgに従って、必要なライブラリをダウンロード・配置等々します。

2. Hello, buildout

とにかく動かしてみましょう。

2.1 仮想環境をオンにする

$ pythonbrew venv use py27

2.2 プロジェクト用のディレクトリを作成する

任意の名前でディレクトリを作ります。

$ mkdir ~/sample_project
$ cd ~/sample_project

以下、sample_projectディレクトリ直下の位置で作業を行います。

2.3 buildoutの初期セットアップ

buildoutのインストール方法によって手順が異なります。

(A) buildoutをpy27環境にインストールする方法

(A-1)
pipを使ってbuildoutを仮想環境py27にインストールします。

$ pip install zc.buildout

(A-2)
buildoutコマンドが使えるようになるので、初期セットアップを実行します。

$ buildout init
(B) buildoutをsample_projectにのみインストールする

(B-1)
buildoutをグローバルなPython環境(ここでは仮想環境のpy27)にインストールしたくない場合は、対象のプロジェクトディレクトリにのみインストールすることが出来ます。(といっても、スクリプトをダウンロードするだけです)

wget "http://svn.zope.org/*checkout*/zc.buildout/trunk/bootstrap/bootstrap.py"

(B-2)
ダウンロードしたbootstrap.pyを実行すれば、初期セットアップが実施できます。

python bootstrap.py

2.4 buildout.cfgを作成する

buildoutの初期セットアップをすると、ミニマムなbuildout.cfgが作成されています。これを編集します。

$ vi buildout.cfg
# 以下の内容に編集する
[buildout]
parts = xmlenv

[xmlenv]
recipe = zc.recipe.egg
eggs =
    lxml
interpreter = python

※コピペする場合、正しくコピペされているか確認してください。

2.5 buildoutを実行する

./bin/buildoutと打つだけです。sample_projectに配備されたbuildoutコマンドを実行する点に注意してください。

$ ./bin/buildout
Not upgrading because not running a local buildout command.
Getting distribution for 'zc.recipe.egg'.
Got zc.recipe.egg 1.3.2.
Installing xmlenv.
Getting distribution for 'lxml'.
Building lxml version 2.3.3.
Building without Cython.
Using build configuration of libxslt 1.1.24
Got lxml 2.3.3.
Generated interpreter '/Users/toggtc/sample_project/bin/pythonparts'.

依存するライブラリが自動でダウンロードされます。

2.6 hello, buildout

環境ができたので、サンプルソースを動かしてみます。

$ mkdir src
$ vi src/hello_buildout.py
# 以下の内容で編集する
from lxml import etree

root = etree.XML('<root><foo><bar>hello, buildout</bar></foo></root>')
print(root.tag)
print(etree.tostring(root))

ソースコードを編集したら、動かします。
ここで、pythonコマンドではなく、sample_projectに配備された./bin/pythonを実行する点に注意してください。

$ ./bin/python ./src/hello_buildout.py
root
<root><foo><bar>hello, buildout</bar></foo></root>

なお、sample_project/bin/pythonではなく、PATHが通っている方のpythonで実行すると、、、

$ python ./src/hello_buildout.py 
Traceback (most recent call last):
  File "hello_lxml.py", line 1, in <module>
    from lxml import etree
ImportError: No module named lxml

このように、lxmlライブラリが無くてエラーになります。buildoutがsample_projectにのみ、lxmlライブラリをインストールしていることが分かります。

3. buildout.cfgの中身

今回使用したbuildout.cfgを再掲します。

[buildout]
parts = xmlenv

[xmlenv]
recipe = zc.recipe.egg
eggs =
    lxml
interpreter = python

[buildout]

[buildout] は、buildout.cfgで必ず記述する宣言です。

parts

parts には、構築するパート(part)を列挙します。複数のパートを列挙するときは、スペースで気切ります。(例:part = xmlenv foo bar)

[xmlenv]

partsで指定したxmlenvの参照先が、[xmlenv]です。xmlenvという名前は任意です。
今回のxmlenvではrecipe, eggs, interpreterの3つの設定を行なっています。

recipe

recipeの正体は、egg(ソースやら何やらのファイルをアーカイブ化したもの)のようです。このeggがPyPIリポジトリに集約されていて、recipe = zc.recipe.eggとすることで、'zc.recipe.egg'を取得しているようです。
この'zc.recipe.egg'は、buildout initで作ったsample_project/eggsディレクトリに各種eggをインストールするためのプラグインのようです。
この'zc.recipe.egg'は、後述するlxmlライブラリのインストールに必要なのです。

参考:http://pypi.python.org/pypi/zc.recipe.egg/

eggs

eggsには、必要なライブラリを列挙しておきます。ここではlxmlを指定しています。

interpreter

sample_project環境で使うPythonインタプリタを設定します。ここでは'python'という名前で設定しました。

4. まとめ

buildoutを使って、独立した環境を作ることが出来ました。
今回は、かなりシンプルなbuildoutプロジェクトでした。lxmlライブラリを使うだけなら、pipやeasy_installを使ったほうが楽かもしれませんが、buildoutでは、その他、サーバの起動や複雑なインストールスクリプトの実行等、多種多様なことが出来ます。
特に、チームで開発を行う場合、個人個人で開発環境をセットアップするよりもbuildoutを使って同じ環境を作ったほうが、トラブルも少なく効率的であると思います。また、個人で開発する場合でも、依存するライブラリや複雑な設定を必要とする場合に、Python本体の環境を汚さずに環境構築できるという利点があります。
buildoutの欠点としては、日本語のドキュメントが少ないことでしょうか。今回の例をみて、「で、結局私が作りたい環境は、buildoutではどうやって作ったらいいの?」と思ったことでしょう。
日本語のリソースとしては、清水川さんが、buildoutのサンプルを作成されています。また、本家のサイトではチュートリアルやrecipeの書き方、代表的なrecipeの紹介がありますので、参考にしてみてください。

(参考)
清水川WEB
zc.buildout メモ
http://www.freia.jp/taka/docs/buildout/index.html

buildout.org
Buildout v1.2.1 documentation
http://www.buildout.org/docs/index.html

今回までで、ひと通りPythonの環境が出来ました。あとは実環境なり仮想環境、あるいはbuildoutから必要なライブラリを引っ張ってきてPythonライフをLet's Enjoy!