箱が…

Amazon箱ストラクチャーが崩れてきそうです。ダンボー作ろうかな。

Buildoutを使う セットアップ編

前回のEgg基礎編ではPython Eggsについて書きました。
今回はいよいよBuildoutをインストールして、設定ファイルにちょっとだけ触れたりします。

Buildoutのインストール

さてインストールするわけですが、早速はまりポイントの登場です。
インストールの方法が二通りあることが原因なので、まずはインストール方法を2つご説明しましょう。

Pythonにインストールした後に任意のディレクトリに展開

Pythonに」とはオペレーティングシステムに入っているPythonに、という意味です。
すなわち、コマンド easy_install や、それよりもいい感じの pip を使って普段通りにパッケージをインストールする方法です。
Buildoutのパッケージ名はzc.buildoutなので、これを指定してインストールします。

# easy_install zc.buildout

pipの場合はこうなります

# pip install zc.buildout

なお、はまりポイント的には「Pythonにインストールする」という点が重要なので、試してませんがユーザー毎のsite-packagesディレクトリにインストールしても同じだと思います。
コマンドを実行し、特に問題がなければPythonへのインストールは完了です。

次に、Buildoutのファイル群を展開したい任意のディレクトリに移動し、コマンドを実行します。

$ buildout init

ファイルやディレクトリが展開されたらBuildoutのディレクトリへのインストールも完了です。
今回参考にした zc.buildout 1.5.2 では、この方法で任意のディレクトリにBuildoutをインストールすると distribute が自動でインストールされました。

任意のディレクトリに直接インストール

Buildoutをダウンロード・インストールする専用のスクリプトを使って、任意のディレクトリ下に直接インストールする方法です。
このスクリプトによってインストールされるBuildoutは、Pythonのシステムから独立しているので環境を全く汚しません。
手順は、Buildoutをインストールしたいディレクトリに移動し

$ mkdir buildout
$ cd buildout

インストールスクリプトをダウンロードし

$ wget "https://raw.github.com/buildout/buildout/master/bootstrap/bootstrap.py"

実行します。
ここで使ったバージョンのPythonが以降のこのBuildout環境でずっと使われることになるようです。また、オプション -d はBuildout環境でEgg基礎編で触れたdistributeを使えという指示です。
最後の init はBuildoutの初期化(必要なファイル・ディレクトリの展開)の指示です。

(追記)2013年1月現在、どうやら古い bootstrap.py は実行時に失敗するようなので、GitHubにある新しい bootstrap.py を使いましょう(上記URL)。新しい方はオプションなしで実行します。

$ python bootstrap.py
はまりポイント

前者の方法でPythonにBuildoutをインストールしたことを忘れて、後者のスクリプトで任意のディレクトリにインストールしようとすると、解りづらいエラーが出てスクリプトが死んだ記憶があります。
面倒くさいので再現と検証はしませんが、Pythonに入れた方のBuildoutを(pipで)アンインストールしたらエラーは出なくなりました。
エラーが出る場合ははまっていないか疑ってみましょう。

Buildoutの設定ファイル

以降、Buildoutに必要なファイル・ディレクトリを展開したディレクトリのことを「Buildoutディレクトリ」と呼ぶことにします。

ここまでで、Buildoutディレクトリに「buildout.cfg」というファイルが生成されていると思います。それが設定ファイルのスケルトンです。
Buildoutディレクトリ/bin/ にある buildout コマンドは、カレントディレクトリにある「buildout.cfg」というファイルを設定ファイルと見なして読み込みます。読み込まれる設定ファイルのファイル名はオプションで変更できますが、いちいち指定するのが面倒なら buildout.cfg のままで使うのが良いでしょう。

以前書いた buildout.cfg をコピーするなどして、buildout init する前にBuildoutディレクトリに設定ファイルが存在する場合、buildout init しても buildout.cfg の生成だけスキップされるので上書きの心配はありません。

設定ファイルの構造

buildout.cfg の構造について説明します。

[buildout]
parts =
    codehl

[codehl]
recipe = zc.recipe.egg
eggs = 
    pygments

buildout.cfg 内の最も大きな要素は上記のサンプルの [buildout][codehl] など[]でくくられた部分を先頭とするカタマリです。
これはセクション(section)と呼ばれていて、1つのセクションは次のセクションが始まるまで続きます。
言うまでもないかも知れませんが、[buildout]の「buildout」、[codehl]の「codehl」の部分がセクション名です。
セクションの中でも buildout セクションは特別で、Buildout全体の設定を記述します。

セクションの中には「key = value」の形でラベルと値を書いていきます。「値」の部分はkeyによって、改行(またはスペース)で区切って複数設定(列挙)できるものと、1つしか指定できないものがあるので注意しましょう。

Buildoutで環境を自動構築してみる

今はここまでわかれば充分でしょう。
上記の buildout.cfg のサンプルを、Buildoutディレクトリの buildout.cfg に上書きしたら以下のコマンドを実行してください。
カレントディレクトリは、Buildoutディレクトリです。

$ bin/buildout

何やらメッセージが出てくると思いますが、要はPyPI – the Python Package Index · PyPIから buildout.cfg に書かれた「pygments」というパッケージをダウンロードしてBuildout環境下にインストールしたということです。
パッケージのダウンロード元のPyPIがたまーーに死んでる場合があるので、失敗したときは時間を空けてリトライするのが優しさとか大人の余裕とかいうものじゃないでしょうかねー

インストールしたPygmentsで遊ぶ

先の bin/buildout コマンドによって、Pygmentsというパッケージがインストールされました。PygmentsはPython製のSyntax highlighterです。
Pygmentsをインストールすると pygmentize というコマンドも同時にインストールされます(Buildoutの機能によるものではない)
この pygmentize でコードに色をつけてみましょう。

ディレクトリが以下のようになっているとして(一部省略してます)

+ buildout
    + bin
        - buildout
        - pygmentize
    - buildout.cfg
+ deepblue_sources
    - setup.py
    + deepblue
        - __init__.py
        - answer.py

Buildoutディレクトリで(ここである必要性は全くありません)以下のコマンドを実行します。

$ bin/pygmentize ../deepblue_sources/deepblue/answer.py

実行結果:

Windowsの方はcmd.exeで上記のコマンドを実行すると、大量のゴミが混入したすごい画面になるので諦めてHTMLに出力しましょう。

> bin\pygmentize -O full,style=colorful -o out.html ..\deepblue_sources\deepblue\answer.py

結果(ブラウザで表示):

おわりに

最後は脱線しましたが、buildout.cfg さえあればどこにでも同じ環境が自動で構築できることがお分かりいただけたかと思います。

次回は設定ファイル編ということにして、buildout.cfg をもっとちゃんと書きます。