2009年10月8日木曜日

reportlabは1.2系では動かない

Google App EngineでPDFを出力するには、reportlabを使うとよいと書かれている。
しかしこのreportlab、ローカルのSDKではバージョンが1.2になると以下のエラーが発生する。

: 'HardenedModulesHook' object has no attribute '_files'

対応方法は、以下のURLから1.9をダウンロードしてアプリケーションに上書きすること。

「Google App Engine プロジェクト ホームページ」
http://code.google.com/p/googleappengine/downloads/list
※検索条件で「All donwloads」を選択する

ちなみに、本番環境ではSDKの環境に関係なくreportlabでPDFを生成できました。



1.2.7では動きました(^^)V

やっぱり駄目でした。具体的には、
1. ソースコードをlatin-1で保存して実行すると、実行できる。
2. ソースコードをutf-8で再保存して実行すると、上記のエラーが発生する
3. ソースコードをlatin-1にもどしても、やはりエラーが発生する
4. アプリケーションの.pycファイルを削除すると、実行できる(1.の状態に戻る)
です。
どうやら、pythonで鬼門のエンコード周りでどこかに不具合があるようです。
ちなみにサーバにデプロイするか、1.1.9にバージョンダウンするとうまく動くという事は、1.2.X系のGAEのSDKに問題がありそう...

3 件のコメント:

  1. reportlabのエラーが出ている該当の行(確かif文がある)を、'return True'にすると問題なく動きました。本番にあげる時には元に戻す必要があります。

    返信削除
  2. manage.pyに書いちゃだめか

    返信削除
  3. とても参考になりました。ありがとうございます。
    私の環境でも.pycがあるとエラーが発生しました。
    とりあえずの処置として、manage.pyにreportlabの*.pycを削除する処理をいれました。
    Index: manage.py
    ===================================================================
    --- manage.py (revision 314)
    +++ manage.py (working copy)
    @@ -1,5 +1,8 @@
    #!/usr/bin/env python
    if __name__ == '__main__':
    + import os
    + os.system('find ./reportlab/ -name "*.pyc" | xargs rm')
    +
    from common.appenginepatch.aecmd import setup_env
    setup_env(manage_py_env=True)

    返信削除