祢占堂

はい

buildout を使って Pyramid な環境を構築してみた

あらすじ

ひさびさに行った液Py読書会が buildout だったし、せっかくなのでねじは Pyramid で何か作るついでに試してみようと思いました。

調べながら紆余曲折してたのそのままメモしていくので、おかしいところあったら東京湾に沈めてください。

ちなみに今回作るアプリケーションの名前は `kusaba` です。VirtualBox 上の Ubuntu 12.04 で作業してます。Python のインストール等はPythonプロフェッショナルプログラミングっていう本に書いてあるから5冊くらい買って参考にするといいですよ。


Pythonプロフェッショナルプログラミング
ビープラウド
秀和システム
売り上げランキング: 87408

なにはともあれ virtualenv

なんかあとになってからいらないかもと思いましたが、いつも使ってるので!いつも使ってるので!

$ mkvirtualenv kusaba
(kusaba)$ 

以降 (kusaba) は省略して書いていきます。

buildout 環境の作成

まず作業用ディレクトリをば。

$ cd ~/
$ mkdir kusaba
$ cd kusaba

bootstrap.py を取得して実行。`-d` は distribute を使うアレです。

$ wget "http://svn.zope.org/*checkout*/zc.buildout/trunk/bootstrap/bootstrap.py"
$ python bootstrap.py -d init

ここで大量に

warning: foobar: byte-compiling is disabled, skipping.

やら

warning: no files found matching '*.txt'

やら

Download error on http://example.com: timed out -- Some packages may not be found!

やら出ますがひとまず放置してます。気になって自主的に調べた人は先生怒らないから正直に教えて下さい。

依存パッケージは、ここで作成される eggs ディレクトリに全部はいります。site-packages には入らないので、なんていうか virtualenv いらないですね…

使用する Python のバージョンも bootstrap.py init したときのやつになるっぽいです。ためしに virtualenv 環境でわざわざ /usr/bin/python2.7 bootstrap.py init とかやったら、bin/py の一行目はちゃんと #!/usr/bin/python2.7 になってました。

Pyramid をインストール

buildout.cfg を以下のように編集して、

[buildout]
parts =
    pyramid

[pyramid]
recipe = zc.recipe.egg
interpreter = py
eggs =
    pyramid

環境をビルドします。

$ bin/build
Uninstalling py.
Installing pyramid.
Generated script '/home/drillbits/kusaba/bin/ptweens'.
Generated script '/home/drillbits/kusaba/bin/proutes'.
Generated script '/home/drillbits/kusaba/bin/pshell'.
Generated script '/home/drillbits/kusaba/bin/prequest'.
Generated script '/home/drillbits/kusaba/bin/pviews'.
Generated script '/home/drillbits/kusaba/bin/bfg2pyramid'.
Generated script '/home/drillbits/kusaba/bin/pcreate'.
Generated script '/home/drillbits/kusaba/bin/pserve'.
Generated interpreter '/home/drillbits/kusaba/bin/py'.

Pyramid の依存パッケージが eggs に入るほか、pip でやると ~/.virtualenv/kusaba/bin に入るコマンドが buildout 環境の bin 配下に入ります。

* Pyramid プロジェクトの作成

チュートリアルを参考にして作ります。virtualenv だと pcreate って打てばよかったコマンドが buildout 環境の bin/pcreate だったりするだけです*1

src というディレクトリを切って、その中に Pyramid プロジェクト `kusaba` を作ることにしました。

$ mkdir src
$ cd src
$ ../bin/pcreate -s alchemy kusaba

階層潜ったので ../bin です。本来ならここで setup.py develop ですが、読書会で清水川先生が「buildout はとにかく setup.py を叩いてくれる」と仰ってたので、そっちでやってみます。

[buildout]
parts =
    pyramid
    kusaba
develop =
    src/kusaba

[pyramid]
recipe = zc.recipe.egg
interpreter = py
eggs =
    pyramid

[kusaba]
recipe = zc.recipe.egg
interpreter = py
eggs =
    kusaba

ビルドしまう。

$ cd ../
$ bin/buildout
:
Generated script '/home/drillbits/kusaba/bin/initialize_kusaba_db'.
:

DBの初期化コマンドも無事できました。ところでこれちゃんと setup.py develop なんですかね。 setup.py install だったりしないですかね。

Pyramid アプリケーションの起動

ここもチュートリアルに従います。まずはDBの初期化。

$ bin/initialize_kusaba_db src/kusaba/development.ini

そして起動!

$ bin/pserve src/kusaba/development.ini
Traceback (most recent call last):
  File "bin/pserve", line 23, in <module>
    sys.exit(pyramid.scripts.pserve.main())
:
  File "/home/drillbits/.buildout/eggs/distribute-0.6.28-py2.7.egg/pkg_resources.py", line 588, in resolve
    raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: waitress   

はいきた。エラーきました。

waitress 自体は eggs にあるのですが、どうも bin/pserve がパスを通してないっぽい…

のでとりあえず buildout.cfg の pyramid セクションに追加。

# 前略
[pyramid]
recipe = zc.recipe.egg
interpreter = py
eggs =
    pyramid
    waitress
# 後略

再びるど。

$ bin/buildout
:
$ bin/pserve src/kusaba/development.ini
Traceback (most recent call last):
  File "bin/pserve", line 23, in <module>
    sys.exit(pyramid.scripts.pserve.main())
:
  File "/home/drillbits/.buildout/eggs/distribute-0.6.28-py2.7.egg/pkg_resources.py", line 588, in resolve
    raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: kusaba

どうやら同じセクションにないといけないっぽいので kusaba セクションを削除して pyramid セクションと統合。

[buildout]
parts =
    pyramid
develop =
    src/kusaba
 
[pyramid]
recipe = zc.recipe.egg
interpreter = py
eggs =
    pyramid
    waitress
    kusaba

ふたたびるど。

$ bin/buildout
:
$ bin/pserve src/kusaba/development.ini
Starting server in PID 15162.
serving on http://0.0.0.0:6532

ウォァァァァァァ動いたようです。

とはいえ依存の書き方とかこれでいいのかいまいち謎なのでニントモカントモな感じはしますね…

あと setup.py test とかでやるテストはどうやるんだろう。

*1:チュートリアルよく見たらこっちも bin/pcreate とかしてますね…でもどのディレクトリに移動しても bin/コマンド になってるしよくわかんないです。