buildout を使って Pyramid な環境を構築してみた
あらすじ
ひさびさに行った液Py読書会が buildout だったし、せっかくなのでねじは Pyramid で何か作るついでに試してみようと思いました。
調べながら紆余曲折してたのそのままメモしていくので、おかしいところあったら東京湾に沈めてください。
ちなみに今回作るアプリケーションの名前は `kusaba` です。VirtualBox 上の Ubuntu 12.04 で作業してます。Python のインストール等はPythonプロフェッショナルプログラミングっていう本に書いてあるから5冊くらい買って参考にするといいですよ。
参考
なにはともあれ 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/コマンド になってるしよくわかんないです。