Djangoはどうでもいいけど、Pythonで開発するときに準備しとくとよさそうなことまとめ
Pythonバージョン
2.6を使う。
なぜ3じゃないか。
WSGIの対応とかWeb3が出てきたり、distutils2がまだアルファってこともあるしね。
3.2が出るまではおあずけと思ってる。
追記
なぜ2.7じゃないか。
各種ディストリビューションにパッケージが出回ってないこともあるし、それほどメリット感じないので2.6。
2.7でも同じことはできます。
パッケージ管理
eggを基本にしましょう。
distutils2からはdist-infoとしてパッケージメタデータが正式採用になります。
今のうちに慣れておこうね。
- virtualenv
- setuptools/distribute
- pip
- buildout
環境構築
virtualenvで仮想環境を作って、buildoutをインストール(virtualenvすればpipとdisutributeはインストール済)
virtualenvですらシステム領域のsite-packagesに入れたくないので、virtualenv.pyをパッケージから取り出して使います。
解凍した中の virtualenv.py をホームディレクトリにでもおいときます。
新しく作るプロジェクトをnewprojectとして環境構築していきます。
$ python ~/virtualenv.py --no-site-packages --distribute newproject
$ cd newproject
$ bin/pip install zc.buildout
$ bin/buildout init
UNIXライクな環境を前提にしたけど、Windowsであれば、bin が scriptsになる。
Pythonパッケージを書いていく
プロジェクトテンプレート
PasteScriptはsetuptools/distribute前提のプロジェクトを展開するのに便利です。
buildout.cfgに書いて環境に導入します。
[buildout]
parts =
paster
[paster]
recipe = zc.recipe.egg
eggs = PasteScript
と、buildout.cfgに書いたら、bin/buildoutを実行して環境を更新します。
zc.recipe.eggというのはbuildoutのレシピで、その名のとおりeggを管理するもの。
今作った環境にeggパッケージをインストールしますが、その影響範囲はparts([paster]とかで区切られているセクション)内に限られます。
新しいパッケージを作るには、以下のコマンドでベースを生成します。
bin/paster create newproject
この時点で、カレントディレクトリがnewproject そのしたにパッケージのディレクトリとしてnewproject、その中にpythonパッケージのnewprojectができあがっています。
きもいですね?
とりあえず、二番目のパッケージ用ディレクトリはsrcとでも変えておきましょう。
mv newproject src
このnewprojectもeggとして管理するためbuildout.cfgに追加します。
[buildout]
parts =
paster
newproject
develop =
src
[paster]
recipe = zc.recipe.egg
eggs = PasteScript
[newproject]
recipe = zc.recipe.egg
eggs = newproject
newprojectを追加したら、再度bin/buildoutを実行して反映。
Webアプリにでもしてみる
とりあえずwsgiアプリなぞ作りたければ、werkzeugやflask, repoze.bfgあたりが手軽。
src/setup.py の install_requires に "Flask" を追加して、再度bin/buildout。
ここで、[newproject]の環境にしか影響を与えないようにFlaskが導入されますが、コマンドがないので確かめようがありません。
[newproject]
recipe = zc.recipe.egg
eggs = newproject
interpreter = py
このように、環境専用のインタプリタを設定します。
くどいようですが、buildout.cfgを編集したので、bin/buildoutを実行します。
すると bin/py ができあがるので、実行してみます。
通常のインタプリタですが、sys.pathには、newprojectとFlask、その他必要なパッケージが追加されています。
とりあえず、Flaskのページにあるサンプルを、src/newproject/__init__.py に記述します。
bin/py src/newproject/__init__.py
とすれば、このwsgiアプリは動きます。
が!
なんでegg作ってるのにスクリプト実行するのかと。
ということで、まずmain関数を作ります。
def main():
app.run()
ま、スクリプト実行されたときの内容を関数にするだけ。
次、これをsetup.pyのentrypointでコンソールコマンドとして実行可能にします。
entry_poinsts="""
[console_scripts]
serve_newproject=newproject:main
"""
console_scriptsセクションの中に、
コマンド名=モジュール名:関数名
と書きます。
さて、ここでbuildout.cfgを編集したわけではないですが、eggの情報を更新したので、ここでもbin/buildoutします。
反映させると、bin/serve_newprojectが作成されています。
実行すれば、さきほどと同じようにHelloアプリケーションが動きます。
っということで、OSやプラットフォームに依存せずにbuildoutに閉じた環境下で作成できます。
ソースとbuildout.cfgがあれば、同じ環境を一発で再構築できます。
まあ、eggやbuildoutの活用が、javaのjarとmavenみたいでなんか敬遠される感じがなきにしもあらず。
お手軽さを求めるなら、virtualenv + pipの環境作ればいいんじゃないかな。