前のエントリーから自作のブログソフトに移行してみたわけだけど、やっぱり自分で作ったものはなんとなく気持ちいいですね。
さて、このブログはXREAでPython2.5で動いているわけですが、もちろん?XREAにPython2.5ははいっていません。ではどうやって動かすか・・・というと答えは簡単。バイナリとして動かしているわけです。
XREAはバイナリCGIが動くのでバイナリにしてしまえばどんなバージョンのPythonでも問題ありません。しかも、たとえばMySQLDBなどの拡張モジュールもきちんとバイナリに含まれるので、多少ファイルサイズは大きいですがアップロードするだけで動くので非常に楽です。
今回はXREAでローカルで作ったPython2.5アプリをバイナリ化して動かすまでを紹介しようかと思います。
バイナリ化ライブラリ:bbfreeze
バイナリ化に使うライブラリですが、俺はbbfreezeを使いました。bbfreezeの特徴は
- すごく簡単
- ライブラリの探索に優れる
- Linux用バイナリが作れる
というところでしょう。
bbfreezeを使う上での注意点
ただ、使う上で色々注意点もあります。書きなぐりなのでちょっと汚いですが、このブログアプリ用のfreezeスクリプトです。
- from bbfreeze import Freezer
- import sys, os, shutil
- from os.path import dirname, abspath, join
- root = abspath(dirname(__file__))
- sys.path = [join(root, d) for d in ["libs"]] + sys.path
- include_lst = []
- for r, dirs, files in os.walk(join(root, "libs")): #指定ディレクトリ以下を全部追加
- if "__init__.py" in files:
- include_lst.append(r)
- for file in (f for f in files if f.endswith(".py") and f != "__init__.py"):
- include_lst.append(join(r, file[:-3]))
- def replace(f):
- return f[len(join(root, "libs"))+1:].replace("/", ".")
- include_lst = map(replace, include_lst)
- include_lst.append("_mysql") # MySQLDBの_mysqlが含まれないので手動で追加
- shutil.copy(join(root, "index.py"), join(root, "index.cgi.py")) #cgi用にリネーム
- f = Freezer("dist", includes=include_lst, excludes=(), )
- f.addScript("index.cgi.py", True)
- f() # starts the freezing process
- os.remove(join(root, "index.cgi.py"))
と、こんな感じです。ほんと汚いな・・・。さてでは注意点を一つ一つ。
-
できる限り自動的に使用しているライブラリを検索してくれるのですが、
__import__で動的にインポートする場合はさすがに無理です。なので、そういうモジュールがある場合、自分で追加する必要があります。このブログアプリではPygments、Markdownあたりが__import__による動的インポートを行っています。 - MySQLDBの_mysqlモジュールのように探索されないのもありますので、注意しないといけません。
-
出力されるバイナリファイル名はメインスクリプトから
.pyを除いたものになります。XREAでcgiとして動かす場合はあらかじめindex.cgi.pyみたいにリネームしておくとindex.cgiが吐き出されるので便利です。
また、dirname(__file__)でディレクトリを取得し、テンプレートファイル用ディレクトリなどを設定している場合、注意が必要です。以下のようにします。
- root_dir = abspath(dirname(__file__))
- if "library.zip" in root_dir:
- root_dir = dirname(root_dir)
- template_dir = os.path.join(root_dir, "templates")
ファイルはlibrary.zipにまとめられますので、実行時は/library.zip/hogehoge.pyのような扱いになります。そのためlibrary.zipがパスに含まれる場合はさらに1個上のディレクトリが求めているディレクトリになります。
アップロード
生成されたファイル群をアップロードするだけです。さすがにサイズは大きいですが。もちろんアップした後index.cgiのパーミッションは設定しましょう。
アクセスしましょう
バッチリ動くはずです。
というわけで、bbfreezeを使えばサクッと任意のバージョンのPythonで作ったアプリがXREAで動かせます。あとは負荷だけが問題です。1日見た限りではweb.pyの場合負荷は大丈夫っぽいです。ぶっちゃけ、Wordpressより速い気がします。web.pyはライトウェイトWEBフレームワークとしてもう少し評価されるべき。Djangoとかだとどうなんですかね。チャレンジャーな方は、ゼヒ。
No comments yet
trackback uriLeave a Comment