Python urllib2设置超时

Python urllib2设置超时,python,post,timeout,urllib2,Python,Post,Timeout,Urllib2,我试图通过使用Python的urllib2模块发出POST请求来获取url。我用以下方式构造请求 handler = urllib2.HTTPHandler() opener = urllib2.build_opener(handler) url = 'xyz...' request = urllib2.Request(url,data='{}') request.add_header('Content-Type','application/json') request.get_method =

我试图通过使用Python的
urllib2
模块发出POST请求来获取url。我用以下方式构造请求

handler = urllib2.HTTPHandler()
opener = urllib2.build_opener(handler)
url = 'xyz...'
request = urllib2.Request(url,data='{}')
request.add_header('Content-Type','application/json')
request.get_method = lambda: 'POST'
try:
   connection = opener.open(request)
except urllib2.HTTPError as e:
   connection = e
except urllib2.URLError as e:
   print 'TIMEOUT: ' + e.reason
我想在某处为打开请求设置超时。根据文件
build\u opener()
调用应返回一个
OpenDirector
实例,该实例应具有超时参数。但我似乎无法让它发挥作用。另外,我构造请求的原因是因为我需要在请求中指定一个空的主体
data='{}'
,而我似乎也无法使用
urlopen
实现这一点。非常感谢您的帮助。

您可以将
timeout
作为参数传递给打开程序的
open
方法调用

使用
lambda
功能正常运行,以确保请求是
POST
而不是
GET
无正文

>>> import urllib2
>>> handler = urllib2.HTTPHandler()
>>> opener = urllib2.build_opener(handler)
>>> request = urllib2.Request('http://httpbin.org/post')
>>> request.get_method = lambda: 'POST'
>>> opener.open(request)
<addinfourl at 4363264800 whose fp = <socket._fileobject object at 0x101b654d0>>

谢谢这很有效。不知道为什么会被否决,提供的链接没有回答我的问题。@brocoli:“没有回答我的问题”是错误的。我在链接中看到了
opener.open(请求,超时=4)
。反对票是因为缺乏研究。
>>> opener.open(request, timeout=0.01)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 431, in open
    response = self._open(req, data)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 449, in _open
    '_open', req)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 409, in _call_chain
    result = func(*args)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1227, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1197, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error timed out>