Python開発環境

From Evernote:

Python開発環境

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をパッケージから取り出して使います。

http://pypi.python.org/pypi/virtualenv からダウンロード
解凍した中の 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の環境作ればいいんじゃないかな。
そういうかたは、http://blog.mitsukuni.org/2010/10/25/python-development-environment によくまとまった文書があるから読んでみるといいよ。