FC2ブログ

スポンサーサイト

-------- --:--:-- --

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Python】【Google App Engine】python-twitterをGAE上で動作させたい 1回目【下書き】

2011-03-27 23:24:33 Sun

次の記事

文章整形していません。。。
そのまんまの作業ログです。
修正予定ですがとりあえずアップしておきます。
pythonは昨日今日始めた初心者です。
GAEもほとんどわかっていないです。
そんな状態でGAE上でtwitter botを動かしたいと思い、その作業ログです。

2011年3月27日23:21:10


2011年3月27日

python twitterをインストールしてGAE上で動作させたいpython初心者のトライアンドエラーログ

■依存のあるライブラリをまずインストールする
参考:http://www.yukun.info/blog/2011/03/python-twitter-install.html

依存ライブラリ

http://cheeseshop.python.org/pypi/simplejson
http://code.google.com/p/httplib2/
http://github.com/simplegeo/python-oauth2

この中でもoauth2はsetuptoolというライブラリが必要でエラーになった
simplejsonをインストールするとsetuptoolライブラリを一緒にインストールしてくれるのでこちらを先に入れる
httplib2は依存なくセットアップできるのであとでも先でもOK

コマンドはそれぞれ「python setup.py install」でOK。
pythonにパスが通っていない場合、パスを通す
それぞれのライブラリソースのアーカイブを解凍したディレクトリに移動して上記コマンドを実行すること

最後に、python-twitter ライブラリをインストールする。

C:\python-twitter-0.8.1>python setup.py build
C:\python-twitter-0.8.1>python setup.py install

importに失敗するのでライブラリを読み込むことに

プロジェクトのプロパティからPyDev-PYTHONPATHよりExternalLibrariesで上記でセットアップできていれば「${PYTHONPATH}\Lib\site-packeages\」フォルダ配下に*.eggなどで上記のインストールしたパッケージがあるのでこれを追加する

GAEでは動かなさそうなので(依存ライブラリのインストールどうするとか)ローカルでとりあえず動かしてみることにする
で、お約束のエラー。

Traceback (most recent call last):
File "D:\usr\local\eclipse_3_6_0_j2ee_pleiades_python\workspace\bot_reminder\src\test.py", line 4, in
statuses = api.GetUserTimeline('bot_reminder')
File "build\bdist.win32\egg\twitter.py", line 2460, in GetUserTimeline
File "build\bdist.win32\egg\simplejson\", line 2460, in GetUserTimeline
File "build\bdist.win32\egg\simplejson\__init__.py", line 385, in loads
File "build\bdist.win32\egg\simplejson\decoder.py", line 402, in decode
File "build\bdist.win32\egg\simplejson\decoder.py", line 420, in raw_decode
simplejson.decoder.JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0)

でもこれはライブラリとtwitter間での問題でローカル環境としてはやるべきことはできている。
https://code.google.com/p/python-twitter/issues/detail?id=83

で、GAEでサードパーティのライブラリを動作させるには…できないみたい!

なので、jarから外部jar参照できないなら中にいれてしまえ!的な発想で全部ぶちこむ!
twitter.pyはソースを放りこみ、依存しているsimplejsonとoauth2はフォルダごとぶちこむ!
これでGAEで起動できるみたいです。

GAE上にのせて、URLへアクセスすると処理が走ります。
URLへアクセスしなければ走らない。

cronで起動したい場合、yamlにlogin: adminを入れるとアプリの管理者で認証されたときのみ実行するようになる。

でも全部ぶちこんだら定義されていない関数とかインポートできないとかってエラーで怒られる。

これで悩んだけれどちょっと出口が見えてきた。
ローカルのpython環境で実行したら動作するのにGAE上のpythonで実行したらエラーになるのはなぜかというと、
GAE上での制約があるからだ!
IDE上でプロジェクトをGAEプロジェクトして作成していればGAE基準でコンパイルしてくれているみたい。
なので、無理やりローカルのpython環境で動作させれば動作するが、GAE上のpython環境で実行すると落ちるのはこういう理由みたいですね。

http://yasakawa.blogspot.com/2010/05/django-nonrel-twitter.html

まずこれ!
GAE上ではos.getlogin()は使えない。

はまりました。

あとこんなのもあるみたいですね。
1. simplejsonはDjangoに含まれるものを使用するようにする。
2. GAE上ではFileCacheは使えない。

ここまでいってないですよ。。。

構文チェック上では2のは問題ないようです。2011年3月27日現在というよりもSDKのバージョンかな。

残りの1つのエラーは下記。
説明 リソース パス ロケーション 型
Unresolved import: pyutil_Version _version.py /bot_reminder/src/oauth2 行 12 PyDev Problem

該当箇所を参照してみるとコメントに
# Maybe there is no pyutil installed.
とあったのでとりあえずインストールしてぶち込んでみることにする。
ローカルでうごいているのでインストール必要なのかわからないのですが、GAE基準のコンパイルでは構文エラーになってしまうためです。

プロジェクトクリーン!
エラー増えたぜ!!

消しました。

_version.py なんてソースの冒頭に
# This is the version of this source code.
って書いてるしいらないんじゃないの?って思い始めたので消すことにします。
いいのか悪いのかしらんけれど。

通った!!
simplejsonどこにいった?!
とりあえずGAE起動してみるか。

Traceback (most recent call last):
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3245, in _HandleRequest
self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3186, in _Dispatch
base_env_dict=env_dict)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 531, in Dispatch
base_env_dict=base_env_dict)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2410, in Dispatch
self._module_dict)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2320, in ExecuteCGI
reset_modules = exec_script(handler_path, cgi_path, hook)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2216, in ExecuteOrImportScript
exec module_code in script_module.__dict__
File "D:\usr\local\eclipse_3_6_0_j2ee_pleiades_python\workspace\bot_reminder\src\test.py", line 2, in
import twitter
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1295, in Decorate
return func(self, *args, **kwargs)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1945, in load_module
return self.FindAndLoadModule(submodule, fullname, search_path)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1295, in Decorate
return func(self, *args, **kwargs)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1847, in FindAndLoadModule
description)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1295, in Decorate
return func(self, *args, **kwargs)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1798, in LoadModuleRestricted
description)
File "D:\usr\local\eclipse_3_6_0_j2ee_pleiades_python\workspace\bot_reminder\src\twitter.py", line 65, in
import oauth2 as oauth
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1295, in Decorate
return func(self, *args, **kwargs)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1945, in load_module
return self.FindAndLoadModule(submodule, fullname, search_path)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1295, in Decorate
return func(self, *args, **kwargs)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1847, in FindAndLoadModule
description)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1295, in Decorate
return func(self, *args, **kwargs)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1798, in LoadModuleRestricted
description)
File "D:\usr\local\eclipse_3_6_0_j2ee_pleiades_python\workspace\bot_reminder\src\oauth2\__init__.py", line 50, in
__version__ = _version.__version__
AttributeError: 'module' object has no attribute '__version__'

やっぱりいるんか。
いや、該当箇所を消し去ってみよう。
で、プロジェクトクリーンしよう。

きたぞ!

よしGAE再起動!

Traceback (most recent call last):
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3245, in _HandleRequest
self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3186, in _Dispatch
base_env_dict=env_dict)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 531, in Dispatch
base_env_dict=base_env_dict)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2410, in Dispatch
self._module_dict)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2320, in ExecuteCGI
reset_modules = exec_script(handler_path, cgi_path, hook)
File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2216, in ExecuteOrImportScript
exec module_code in script_module.__dict__
File "D:\usr\local\eclipse_3_6_0_j2ee_pleiades_python\workspace\bot_reminder\src\test.py", line 6, in
api = twitter.Api()
File "D:\usr\local\eclipse_3_6_0_j2ee_pleiades_python\workspace\bot_reminder\src\twitter.py", line 1970, in __init__
self.SetCache(cache)
File "D:\usr\local\eclipse_3_6_0_j2ee_pleiades_python\workspace\bot_reminder\src\twitter.py", line 3274, in SetCache
self._cache = _FileCache()
File "D:\usr\local\eclipse_3_6_0_j2ee_pleiades_python\workspace\bot_reminder\src\twitter.py", line 3607, in __init__
self._InitializeRootDirectory(root_directory)
File "D:\usr\local\eclipse_3_6_0_j2ee_pleiades_python\workspace\bot_reminder\src\twitter.py", line 3666, in _InitializeRootDirectory
root_directory = self._GetTmpCachePath()
File "D:\usr\local\eclipse_3_6_0_j2ee_pleiades_python\workspace\bot_reminder\src\twitter.py", line 3662, in _GetTmpCachePath
return os.path.join(tempfile.gettempdir(), cache_directory)
File "C:\Program Files\Google\google_appengine\google\appengine\dist\tempfile.py", line 57, in PlaceHolder
raise NotImplementedError("Only tempfile.TemporaryFile is available for use")
NotImplementedError: Only tempfile.TemporaryFile is available for use

もういや。
自分で鯖立てたほうがはやくないですか?ってきがしてきた。
GAEの制約多すぎ。

http://stackoverflow.com/questions/3586134/how-to-avoid-notimplementederror-only-tempfile-temporaryfile-is-available-for-us
http://osdir.com/ml/GoogleAppEngine/2009-03/msg01240.html

だめなんでしょ、一時ファイル。

ちょっと検索してみる。

http://d.hatena.ne.jp/parosky/20110222/1298347473

api = twitter.Api('cache=NONE')
なんてやってみたけれどだめだね。
構文間違えているか?
ドキュメント読むか。

ちなみに今直面しているエラーは、
2. GAE上ではFileCacheは使えない。
これだね。
コンパイルは通るけれどスタティックなファイルを作成しようとしていてその制約にひっかかっている。

今やっていることは、GAE上ので制約のためのコード修正だね。

しょうもなさ過ぎて泣きそう。
上の構文は間違えている!
api = twitter.Api(cache=None)
これでいいはず。

よしきた!!!

空白ページだがとりあえずOKだぜ!

ソースの一行目にprint 'hoge' 的なものを出力するとブラウザに表示されて、出力しないとブラウザに表示されないという謎はありますが、エラーにはなってないっぽいからOK!
これはGAEがHTTPリクエストまでに標準出力があるとメモリ上にテキストエリアみたいなのを確保してくれるけれど、HTTPリクエストまでに標準出力がなかったら確保しないからレスポンスも何もしないってことかな。
あと、simplejsonどこにいった?!というのもありますがとりあえず動いたからOK!

これで一段落はついた気がします。
あとはBigTableへのアクセスなどができれば目的のものへの作り込みのみとなります!
やったよ!


スポンサーサイト

⇒comment

Secret

名言集
全記事(数)表示
全タイトルを表示
ブログ内検索
Loading
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。