appengine_config.pyに、PYTHONPATHを切る

サードパーティ製のPythonライブラリを使おうと思った時、うまくimportできるものとそうでないものがある。importできない原因の1つに、ライブラリ自身が依存している他パッケージをimportする際に、そのパッケージにPYTHONPATHが通っていること前提になっている(つまり、from fuga import hoge じゃなく、import hoge している)ことが挙げられる。
依存ライブラリが同一パスに存在していれば問題ないのだが、パスが異なる場所にあると、fromでパッケージ場所を指定しないので、そのパッケージが見つけられず、importできない、という事態に陥る。

これを解消するために、appengine_config.pyを使う。
appengine_config.pyは、プロジェクトのルート(=app.yamlが存在する場所)に置く。
中身はこんな感じ。

# -*- coding: utf-8 -*-
import os
import sys
import logging

ROOTPATH = os.path.dirname(__file__)
LIBPATH = os.path.join(ROOTPATH, 'src/lib')
sys.path.append(LIBPATH)
sys.path.append(os.path.join(LIBPATH, "dateutil"))

このようにして、実行時にPYTHONPATHを切ることで、ライブラリにパスが通った状態を作り出す。
この例では、ソースはsrc配下にあり、ライブラリはsrc/lib配下に置く。dateutilというライブラリは、src/libの下にdateutilというフォルダを作ってそこの配下に置いてある。

appengine_config.pyはいつロード(ていうか実行)されるかというと、アプリケーションのエントリポイントが生成されたとき(つまり初回リクエストを受け取ったとき)である。app.yamlのある場所に1つだけこのファイルを置くということは、この処理はプロジェクトに対して1つだけということで、エントリポイント毎に1つではない。つまり、プロジェクト内にエントリポイントが複数ある場合は、複数あるエントリポイントのうち最初にリクエストが発生したときにロードされる。