urllib2 documentation說超時參數在Python 2.6中添加。不幸的是,我的代碼庫已經在Python 2.5和2.4平臺上運行。在Python 2.6之前的版本中urllib2.urlopen()的超時
是否有任何替代方法來模擬超時?我想要做的就是讓代碼與遠程服務器通話一段固定的時間。
也許任何替代的內置庫? (不想安裝第三方,像pycurl)
urllib2 documentation說超時參數在Python 2.6中添加。不幸的是,我的代碼庫已經在Python 2.5和2.4平臺上運行。在Python 2.6之前的版本中urllib2.urlopen()的超時
是否有任何替代方法來模擬超時?我想要做的就是讓代碼與遠程服務器通話一段固定的時間。
也許任何替代的內置庫? (不想安裝第三方,像pycurl)
您可以通過使用爲所有插座操作(包括HTTP請求),一個全球性的超時:
這樣的:
import urllib2
import socket
socket.setdefaulttimeout(30)
f = urllib2.urlopen('http://www.python.org/')
在這種情況下
,你的urllib2請求將超時30秒後拋出套接字異常。 (這是在Python 2.3中添加的)
我覺得你最好的選擇是補丁(或部署的本地版本),你的urllib2與the change from the 2.6 maintenance branch
該文件應在/usr/lib/python2.4/urllib2.py
(Linux和2.4)
我使用標準庫中的httplib。它有一個簡單的API,但只能處理你可能猜到的http。 IIUC urllib使用httplib來實現http的東西。
不幸的是,httplib僅支持2.6中的超時。 – rubayeet
那麼,在2.4或2.6中處理方式超時是相同的。如果你在2.6中打開urllib2.py文件,你會發現它需要額外的參數作爲超時,並使用socket.defaulttimeout()方法處理它,如上所述是答案1.
所以你真的不需要更新你的urllib2 .py在這種情況下。
如果您有相當多的煩惱,可以覆蓋urllib2.HTTPHandler使用的httplib.HTTPConnection類。
def urlopen_with_timeout(url, data=None, timeout=None):
# Create these two helper classes fresh each time, since
# timeout needs to be in the closure.
class TimeoutHTTPConnection(httplib.HTTPConnection):
def connect(self):
"""Connect to the host and port specified in __init__."""
msg = "getaddrinfo returns an empty list"
for res in socket.getaddrinfo(self.host, self.port, 0,
socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
self.sock = socket.socket(af, socktype, proto)
if timeout is not None:
self.sock.settimeout(timeout)
if self.debuglevel > 0:
print "connect: (%s, %s)" % (self.host, self.port)
self.sock.connect(sa)
except socket.error, msg:
if self.debuglevel > 0:
print 'connect fail:', (self.host, self.port)
if self.sock:
self.sock.close()
self.sock = None
continue
break
if not self.sock:
raise socket.error, msg
class TimeoutHTTPHandler(urllib2.HTTPHandler):
http_request = urllib2.AbstractHTTPHandler.do_request_
def http_open(self, req):
return self.do_open(TimeoutHTTPConnection, req)
opener = urllib2.build_opener(TimeoutHTTPHandler)
opener.open(url, data)
您必須在兩處設置超時。
import urllib2
import socket
socket.setdefaulttimeout(30)
f = urllib2.urlopen('http://www.python.org/', timeout=30)
兩者都獨立工作。然而超時= 30自己工作。這對我來說是最好的答案,所以我刪除了-1。如果您將答案的標題修改爲「您可以選擇在一個或兩個地方設置超時時間」。另外主要的問題是解決Python版本的問題。 – ruralcoder
'urllib2模塊已在Python 3.0中分成幾個模塊,名爲urllib.request和urllib.error.'但其餘的代碼很簡單。 – MewX