【问题标题】:Python Requests get doesn't return unless a timeout is specified除非指定超时,否则 Python 请求 get 不会返回
【发布时间】:2015-04-10 01:04:05
【问题描述】:

这个请求永远不会返回(或者至少在我的耐心范围内):

import requests
r = requests.get('http://en.wikipedia.org/w/api.php?rcprop=ids&format=json&action=query&rclimit=10&rctype=edit&list=recentchanges&rcnamespace=0', headers={'user-agent': 'api test'})

按 Ctrl+C 总是会产生这个回溯:

^CTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/requests/api.py", line 55, in get
    return request('get', url, **kwargs)
  File "/usr/lib/python2.7/dist-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 383, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 486, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python2.7/dist-packages/requests/adapters.py", line 330, in send
    timeout=timeout
  File "/usr/lib/python2.7/dist-packages/urllib3/connectionpool.py", line 542, in urlopen
    body=body, headers=headers)
  File "/usr/lib/python2.7/dist-packages/urllib3/connectionpool.py", line 367, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/lib/python2.7/httplib.py", line 973, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python2.7/httplib.py", line 1007, in _send_request
    self.endheaders(body)
  File "/usr/lib/python2.7/httplib.py", line 969, in endheaders
    self._send_output(message_body)
  File "/usr/lib/python2.7/httplib.py", line 829, in _send_output
    self.send(msg)
  File "/usr/lib/python2.7/httplib.py", line 791, in send
    self.connect()
  File "/usr/lib/python2.7/httplib.py", line 772, in connect
    self.timeout, self.source_address)
  File "/usr/lib/python2.7/socket.py", line 562, in create_connection
    sock.connect(sa)
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)

在请求中添加timeout=5 会导致请求在超时到期后成功(即从API 请求返回正确的数据)。但是,对于每个 API 请求,这当然会给我的应用程序增加 5 秒的延迟。

这里出了什么问题?

【问题讨论】:

  • 你用python3吗?我用python2.7.5 OK!
  • 您的请求在我尝试时运行良好,python 3.4 和 2.7 都可能与其他内容有关

标签: python python-2.7 python-requests


【解决方案1】:

这是由于 IPv6 在我的网络上不能很好地工作。 httplib(因此请求)似乎更喜欢 IPv6(如果可用),但如果它不能很好地工作,那么您可以在 IPv6 请求超时时等待很长时间。设置超时会导致它在超时到期后回退到 IPv4,然后成功。在我的网络上禁用 IPv6 已经解决了这个问题(我假设会修复 IPv6)。

【讨论】:

    猜你喜欢
    • 2012-08-31
    • 2019-03-04
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    相关资源
    最近更新 更多