Google Appengine で urllib2 が「HTTPResponse instance has no attribute 'readline'」というエラー

タイトルのようなエラーに遭遇したので、それの回避した時のメモ

エラー内容

import urllib2
url = "http://www.google.com/"
try:
    result = urllib2.urlopen(url)
except urllib2.URLError, e:
    print e

こんな感じでフツーにurllib2を使うと下記のようなエラーになる。

File "/usr/local/Cellar/python/2.7.2/lib/python2.7/urllib2.py", line 1199, in http_open
    return self.do_open(httplib.HTTPConnection, req)
File "/usr/local/Cellar/python/2.7.2/lib/python2.7/urllib2.py", line 1190, in do_open
    resp = addinfourl(fp, r.msg, req.get_full_url())
File "/Users/tell_k/Work/hogehoge/google_appengine/google/appengine/dist27/urllib.py", line 978, in __init__
    addbase.__init__(self, fp)
File "/Users/tell_k/Work/hogehoge/google_appengine/google/appengine/dist27/urllib.py", line 926, in __init__
    self.readline = self.fp.readline
AttributeError: HTTPResponse instance has no attribute 'readline'

環境

  • Google App Engine SDK 1.6.1
  • Python2.7

という組み合わせで起きるバグっぽい。詳しくは参考URLを参照のこと。

回避方法

SDKのバージョンを戻すのも面倒だったので、「google/appengine/dist27/urllib.py」を直接いじる事で暫定対処。926行目付近を下記のように修正

class addbase:
    """Base class for addinfo and addclosehook."""

    def __init__(self, fp): 
        self.fp = fp 
        self.read = self.fp.read
-       self.readline = self.fp.readline
+       if hasattr(self.fp, "readline"): self.readline = self.fp.readline
        if hasattr(self.fp, "readlines"): self.readlines = self.fp.readlines
        if hasattr(self.fp, "fileno"):
            self.fileno = self.fp.fileno

とりあえず普通に使う分には問題なかった。

おわり