- IPCE r5は標準では、IronPythonのsocketモジュールを使用している
- IPCE r5で、socketモジュールの独自実装が始まっている
import fepy
fepy.override_builtin('socket')
早速、urllibをインポートしてurllib.urlopen()関数を呼んでみると、残念ながらエラーになってしまいました。どうも返ってくるはずのファイル風オブジェクトが、正しいオブジェクトを持っていないのが原因のようです。
そこで、色々とハックしてみました。ハックしていくとhttplibが、socketのmakefile()を呼んでいることを見つけ、このmakefileが正しい結果を返さないのが原因でした。これに対処するには、socket.pyのmakefileメソッドの実装を変更する必要があります。
変更前:
stream = NetworkStream(self.socket)
return file(stream, mode)
変更後:
return _fileobject(self, mode, bufsize)
つまり、NetworkStreamオブジェクトをファイルオブジェクトに変換できないというのが原因でした。変更した_fileobjectのインスタンスは、httplibやhttplib2が使用しているsocketモジュールのオブジェクトで、CPythonのドキュメントには記載されていません。このことをFePyプロジェクトでは知っていたから、socketモジュールの独自実装を行っているようです。
この変更が完了したら、IPCE r5からでもIronPython 1.0.1からでもurllibのurlopen()関数やurlretrieve()関数が正常に動作するようになりました。
0 件のコメント:
コメントを投稿