为什么来自urllib的这个错误?

Nik*_*ntz 10 python google-app-engine urllib2

使用urllib时出现一个奇怪的错误:

INFO     2011-12-07 07:02:45,101 main.py:884] urlhttp://maps.googleapis.com/maps/api/geocode/json?latlng=59.3333,18.05&sensor=false
WARNING  2011-12-07 07:02:45,103 urlfetch_stub.py:428] Stripped prohibited headers from URLFetch request: ['Host']
ERROR    2011-12-07 07:02:45,210 main.py:346] HTTPResponse instance has no attribute 'readline': 
Traceback (most recent call last):
  File "/media/Lexar/montao/lib/webapp2/webapp2.py", line 545, in dispatch
    return method(*args, **kwargs)
  File "/media/Lexar/montao/montaoproject/main.py", line 885, in get
    jsondata = json.load(urllib2.urlopen(url))
  File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 391, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 409, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1185, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1176, in do_open
    resp = addinfourl(fp, r.msg, req.get_full_url())
  File "/media/Lexar/montao/google/appengine/dist27/urllib.py", line 978, in __init__
    addbase.__init__(self, fp)
  File "/media/Lexar/montao/google/appengine/dist27/urllib.py", line 926, in __init__
    self.readline = self.fp.readline
AttributeError: HTTPResponse instance has no attribute 'readline'
Run Code Online (Sandbox Code Playgroud)

以前的代码是

  url = 'http://maps.googleapis.com/maps/api/geocode/json' + \
    '?latlng={},{}&sensor=false'.format(entity.geopt.lat, entity.geopt.lon)
  logging.info('url%s' % url)
  jsondata = json.load(urllib2.urlopen(url))
Run Code Online (Sandbox Code Playgroud)

你能告诉我这里有什么问题吗?我在某处读到响应对象没有"get"方法然后它如何工作?我认为区别在于我从SDK 1.6升级到1.6.1预发布.正在运行的代码与生成错误消息的代码之间可能存在一些其他差异.

谢谢

更新

如答案中所述,以下使用urlfetch的工作方式是:

  url = 'http://maps.googleapis.com/maps/api/geocode/json' + \
    '?latlng={},{}&sensor=false'.format(entity.geopt.lat, entity.geopt.lon)
  logging.info('url%s' % url)

  from google.appengine.api import urlfetch
  result = urlfetch.fetch(url)
  jsondata = json.loads(result.content)
Run Code Online (Sandbox Code Playgroud)

bos*_*ter 14

这似乎是SDK的一个错误.我能够复制完全相同的行为.你有什么理由urllib2而不是用urllib

使用Python2.7和SDK 1.6.1,我测试了以下内容:

import urllib  
url = 'http://maps.googleapis.com/maps/api/geocode/json' + \
        '?latlng={},{}&sensor=false'.format(entity.geopt.lat, entity.geopt.lon)
logging.info('url%s' % url)
jsondata = json.load(urllib.urlopen(url))
Run Code Online (Sandbox Code Playgroud)

它按预期工作.

如果我能确定导致文件读取错误的原因,我会跟进/提交错误.

注意:我测试了KJuly建议的代码,它失败并出现同样的错误.它似乎urllib2依赖于urllib它不应该的时间.进一步挖掘.

编辑:由于urlliburllib2只是包装urlfetch,我可能还建议如下:

from google.appengine.api import urlfetch
result = urlfetch.fetch(url)
jsondata = json.loads(result.content)
Run Code Online (Sandbox Code Playgroud)

第二次编辑:在任何一种情况下,我们使用的是本地版本的(/usr/lib/python2.7/urllib2.py)urllib2,然后尝试与GAE特定版本的urllib(google/appengine/dist27/urllib.py)进行交互.