2010年9月27日月曜日

gunicorn で web.py 製のアプリケーションを動かす



gunicorn とは Ruby の unicorn を元に開発された Python 用の HTTP サーバです。この gunicorn を使って web.py 製のアプリケーションを動かすことができたのでその備忘録。


後々 nginx と連携させて自作の Web アプリをデプロイしたいなーとか思ってます。


今回構築した環境は



  • OS: Mac OS X Snow Leopard

  • Python: 2.6.6 (MacPortsより)

  • web.py: 0.33 (easy_install にて)

  • gunicorn: 0.8.1 (easy_install にて)


web.py と gunicorn はそれぞれ



$ sudo easy_install-2.6 web.py
$ sudo easy_install-2.6 gunicorn


でインストールしました。


また、MacPorts からインストールした easy_install を使った場合、gunicorn は /opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin にインストールされます。PATH が通ってない場合はあらかじめ設定しておく必要があります。


今回使ったソースは web.py の公式でも紹介されている 'Hello World!' アプリです。


app.py



#!/usr/bin/env python
# -*- coding:utf-8 -*-
import web

urls = (
'/(.*)', 'hello'
)

app = web.application(urls, globals())

class hello:
def GET(self, name):
if not name:
name = 'World'
return 'Hello, ' + name + '!'

if __name__ == '__main__':
app.run()


このソースを一行書き換えれば gunicorn (というか WSGI)への対応完了です。


app.py



#!/usr/bin/env python
# -*- coding:utf-8 -*-
import web

urls = (
'/(.*)', 'hello'
)

app = web.application(urls, globals()).wsgifunc() # <- .wsgifunc() を追加!

class hello:
def GET(self, name):
if not name:
name = 'World'
return 'Hello, ' + name + '!'

if __name__ == '__main__':
app.run()


次に、gunicorn での起動方法です。app.py が置いてあるディレクトリで以下のコマンドを実行します。



$ gunicorn app:app
2010-09-26 22:23:50 [93920] [INFO] Arbiter booted
2010-09-26 22:23:50 [93920] [INFO] Listening at: http://127.0.0.1:8000
2010-09-26 22:23:50 [93922] [INFO] Worker spawned (pid: 93922)


これで起動完了です。 gunicorn に渡す引数は、(モジュール名):(変数名) です。今回の場合は app.py でモジュール名が app、wsgifunc()の返り値を代入してる変数名が app なので、app:app となります。


ファイルの変更が動的に反映されるので、開発時にはかなり便利ですね。


次は nginx と連携して動作させる設定を行なってみようと思います。


みんなのPython 改訂版
みんなのPython 改訂版
posted with amazlet at 10.09.23
柴田 淳
ソフトバンククリエイティブ
売り上げランキング: 75071


初めてのPython 第3版
初めてのPython 第3版
posted with amazlet at 10.09.23
Mark Lutz
オライリージャパン
売り上げランキング: 57132





2010年9月25日土曜日

nose を複数バージョンの Python で使う



nose とは Python 用のテストフレームワークです。Python には他にも unittest や doctest などがありますが、使いやすいという理由でこれを使ってます。


python_select で Python のバージョンを切り替えながら nose を使っていると、どうやら python_select による変更が反映されてないのではないか?ということに気づきました。


easy_install によってインストールされた nosetests は /usr/local/bin 以下に設置されていたので、中身を見てみます。



#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'nose==0.11.4','console_scripts','nosetests'
__requires__ = 'nose==0.11.4'
import sys
from pkg_resources import load_entry_point

sys.exit(
load_entry_point('nose==0.11.4', 'console_scripts', 'nosetests')()
)


一行目を見る限り、どうやらデフォルトでインストールされている Python を利用しているようです。


そこで、以下のように修正しました。



#!/usr/bin/env python
# EASY-INSTALL-ENTRY-SCRIPT: 'nose==0.11.4','console_scripts','nosetests'
__requires__ = 'nose==0.11.4'
import sys
from pkg_resources import load_entry_point

sys.exit(
load_entry_point('nose==0.11.4', 'console_scripts', 'nosetests')()
)


これで、python_select による変更が反映されるようになりました。


ただし、nose を新しいバージョンにアップデートするたびに修正が必要になるのが面倒ですね。


nose や unittest などのテストフレームワークについては


エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス
売り上げランキング: 8790


に詳しく載ってます。今読んでますが難しい……。





2010年9月24日金曜日

Python 入門(環境構築編 At Mac OSX Snow Leopard)



github に Python 入門的な記事を上げてるのですが、こっちでも紹介したいと思います。環境構築なども含めて。


今回は Mac OSX 10.6 を前提にしています。


ちなみに、github に上げてる記事はこちら→Python 基礎:目次


Python インタプリタのインストール


OSX では、Python インタプリタが大きく3系統に分けられます。



  • デフォルトでインストールされている Python

  • Python の公式サイトにあるインストーラを利用してインストールした Python

  • MacPorts を利用してインストールした Python


これらはそれぞれ、



  • /usr/bin/python

  • /usr/local/bin/python

  • /opt/local/bin/python


にインストールされます。


今回はバージョン管理が簡単な MacPorts 版の Python をインストールしようと思います。


MacPorts のインストール

既に MacPorts がインストール済みの方は読み飛ばしてください。


MacPorts とは、Mac で使用可能なパッケージ管理システムです。


Python 開発で必要なツールはだいたいこれで揃います。


インストーラは http://www.macports.org/install.php からダウンロードできます。


OS のバージョンごとにインストーラが異なるので気をつけましょう。


今回は Snow Leopard のインストーラをダウンロードします。


インストーラでは基本的に [続ける] or [Agree] をポチポチ押してれば問題ありません。


MacPorts 用の PATH設定

以下は bash, zsh 用の設定です。


追記(2010/9/23): 記述修正しました。



PATH=/opt/local/bin:/opt/local/sbin/:$PATH
PATH=$PATH:/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin


2行目はこれからインストールする Python 用の記述です。


MacPorts のアップデート

MacPorts を最新の状態にアップデートします。



$ sudo port -d selfupdate
$ sudo port -d sync


Python インタプリタのインストール

今回は Python 2.7 をインストールします。



$ sudo port install python27


これで、後はインストール完了を待ちます(しばらく時間がかかるかもしれません)。


ちなみに、現在 Python は 2.x 系列と 3.x 系列が並行してリリースされています。


2.x と 3.x は互換性が無いため、過去の資産が使えない 3.x よりは 2.x の方が利用される例が多いようです。


そのため、今回は 2.x 系列の最新版である 2.7 で進めることとします。


インタプリタを動かしてみる


まずは、Python が正しくインストールされたか確認します。以下のコマンドを実行して、「Python 2.7」と表示されるか確認しましょう。



$ python -V
Python 2.7


このとき、「Python 2.6.1」と表示された場合、正しく PATH が通ってないことが考えられます。


設定を改めて確認しましょう。


次にインタプリタを動かしてみます。



$ python
Python 2.7 (r27:82500, Sep 23 2010, 18:11:42)
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>


こんな感じで表示されたら OK です。


では、Hello world を実行してみます。



>>> print 'Hello world!'
Hello world!


次に Python インタプリタを終了します。


Ctrl-D か、exit() と入力すると終了します。


sitecustomize.py の設定


Python はデフォルトだと文字コードが ascii になってるので、これを UTF-8 に変更します。


以下のように、site-packages というディレクトリの中に sitecustomize.py を作成します。



$ sudo vim /opt/local/Library/Frameworks/Python.framework/Versions/Current/lib/python2.7/site-packages/sitecustomize.py


sitecustomize.py には以下のように記述します。



#!/usr/bin/env python
import sys
sys.setdefaultencoding("utf-8")


easy_install のインストール


easy_install とは、Python のモジュールのインストールやアップデートを行うためのツールです。


Perl の CPAN や、Ruby における RubyGems にあたります。


MacPorts 用の easy_install は、py27-setuptools というパッケージをインストールすると一緒にインストールされます。



$ sudo port install py27-setuptools


easy_install の使い方

引数として、インストールしたいモジュールのモジュール名を指定します。


例えば BeautifulSoup というモジュールをインストールする場合は以下のようにします。


アップデートする場合も同様です。



$ sudo easy_install BeautifulSoup


まとめ


とりあえずここまですれば、最低限の開発環境になってるかと思います。


続きはまたいつか。


みんなのPython 改訂版
みんなのPython 改訂版
posted with amazlet at 10.09.23
柴田 淳
ソフトバンククリエイティブ
売り上げランキング: 75071


初めてのPython 第3版
初めてのPython 第3版
posted with amazlet at 10.09.23
Mark Lutz
オライリージャパン
売り上げランキング: 57132