読者です 読者をやめる 読者になる 読者になる

ツヨシのブログ

技術的な事とか日常の事とか徒然なるままに

Google App EngineでIRCロガー

IRCクライアント

GAE(Google App Engine)をつかってIRCロガーをつくろうと思い、pythonで適当に記述。とりあえず、PC上で動作することを確認した。

socket通信エラー

しかし、PC上のテストではうまくいくのだが、アップロードして実機上で動作させようとしたのだが、うまくいかない。どうやら、ソケット通信を行うため、ソケットの定義とコネクションを開始しようとするところでうまくいかないようだ。エラーの内容を見るとソケット通信の下のモジュールで動作ていない。'remote_socket' とか 'Resolve()'が見つからないと。

Traceback (most recent call last):
File "", line 1, in connect
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/remote_socket/_remote_socket.py", line 955, in connect
self._CreateSocket(address)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/remote_socket/_remote_socket.py", line 804, in _CreateSocket
self._SetProtoFromAddr(request.mutable_remote_ip(), address)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/remote_socket/_remote_socket.py", line 850, in _SetProtoFromAddr
proto.set_packed_address(self._GetPackedAddr(address))
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/remote_socket/_remote_socket.py", line 845, in _GetPackedAddr
AI_NUMERICSERV|AI_PASSIVE):
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/remote_socket/_remote_socket.py", line 431, in getaddrinfo
canonical=(flags & AI_CANONNAME))
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/remote_socket/_remote_socket.py", line 250, in _Resolve
canon, aliases, addresses = _ResolveName(name, families)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/remote_socket/_remote_socket.py", line 268, in _ResolveName
apiproxy_stub_map.MakeSyncCall('remote_socket', 'Resolve', request, reply)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 94, in MakeSyncCall
return stubmap.MakeSyncCall(service, call, request, response)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 308, in MakeSyncCall
rpc.CheckSuccess()
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_rpc.py", line 133, in CheckSuccess
raise self.exception
CallNotFoundError: The API package 'remote_socket' or call 'Resolve()' was not found.

ん?なぜ?と思って調べてみると、socketモジュールはimportできるけど使えないようだ。
http://code.google.com/intl/ja/appengine/docs/python/runtime.html

ピュア Python

Python ランタイム環境では、Python 2.5.2 を使用します。

Python ランタイム環境のすべてのコードは Python のみで記述される必要があり、C 拡張やその他のコンパイルされる必要のあるコードは使用できません。

この環境には、Python 標準ライブラリが含まれます。ネットワークやファイルシステムへの書き込みのように、コア関数が App Engine でサポートされていないため、無効になっているモジュールもいくつかあります。さらに、os モジュールも入手可能ですが、サポートされていない機能は無効になっています。サポートされていないモジュールをインポートしようとしたり、サポートされていない機能を使用しようとすると例外が返されます。

標準ライブラリ内のモジュールには、App Engine で作動するよう置き換えられたか、カスタマイズされたものも少数あります。次に例を示します。

* cPickle は pickle にエイリアスされます。cPickle 固有の機能はサポートしていません。
* marshal は空です。インポートは成功しますが、使用できません。
* 次のモジュールは同様に空です。 imp, ftplib, select, socket
* tempfile は、StringIO にエイリアスされる TemporaryFile を除いて無効になります。
* logging は使用可能であり、使用は推奨されています。以下をご覧ください。

微妙だ。。。
つまり、socket通信はJavascriptで記述しろということかいな。めんどくさいな。

プログラミング Google App Engine

プログラミング Google App Engine