Python urllib2.urlopen无限冻结脚本,即使设置了超时

Python urllib2.urlopen无限冻结脚本,即使设置了超时,python,urllib2,Python,Urllib2,函数urllib2.urlopen冻结。所以我的问题很简单: 为什么urlopen即使设置了超时,也要永远冻结我的脚本 我如何访问URL上的数据(在本例中:),而不让Python进程永久冻结 这是冻结的零件(在中): 这是键盘中断后的堆栈跟踪 Traceback (most recent call last): File "", line 1, in File "honsapp/own3dStreamsUpdater.py", line 53, in updateStreamInf

函数
urllib2.urlopen
冻结。所以我的问题很简单:

  • 为什么
    urlopen
    即使设置了超时,也要永远冻结我的脚本
  • 我如何访问URL上的数据(在本例中:),而不让Python进程永久冻结
这是冻结的零件(在中):

这是键盘中断后的堆栈跟踪

Traceback (most recent call last): File "", line 1, in File "honsapp/own3dStreamsUpdater.py", line 53, in updateStreamInfo streamInfo = getStreamInfo(stream) File "honsapp/own3d.py", line 98, in getStreamInfo connection = urllib2.urlopen(request, timeout=10) File "/usr/local/lib/python2.7/urllib2.py", line 126, in urlopen return _opener.open(url, data, timeout) File "/usr/local/lib/python2.7/urllib2.py", line 394, in open response = self._open(req, data) File "/usr/local/lib/python2.7/urllib2.py", line 412, in _open '_open', req) File "/usr/local/lib/python2.7/urllib2.py", line 372, in _call_chain result = func(*args) File "/usr/local/lib/python2.7/urllib2.py", line 1199, in http_open return self.do_open(httplib.HTTPConnection, req) File "/usr/local/lib/python2.7/urllib2.py", line 1170, in do_open r = h.getresponse(buffering=True) File "/usr/local/lib/python2.7/httplib.py", line 1027, in getresponse response.begin() File "/usr/local/lib/python2.7/httplib.py", line 407, in begin version, status, reason = self._read_status() File "/usr/local/lib/python2.7/httplib.py", line 365, in _read_status line = self.fp.readline() File "/usr/local/lib/python2.7/socket.py", line 447, in readline data = self._sock.recv(self._rbufsize) KeyboardInterrupt 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 updateStreamInfo中第53行的文件“honsapp/own3dStreamsUpdater.py” streamInfo=getStreamInfo(流) getStreamInfo中第98行的文件“honsapp/own3d.py” 连接=urllib2.urlopen(请求,超时=10) 文件“/usr/local/lib/python2.7/urllib2.py”,urlopen中的第126行 return\u opener.open(url、数据、超时) 文件“/usr/local/lib/python2.7/urllib2.py”,第394行,打开 响应=自身打开(请求,数据) 文件“/usr/local/lib/python2.7/urllib2.py”,第412行,打开 "开放", 文件“/usr/local/lib/python2.7/urllib2.py”,第372行,在调用链中 结果=func(*args) 文件“/usr/local/lib/python2.7/urllib2.py”,第1199行,在http\u open中 返回self.do_open(httplib.HTTPConnection,req) 文件“/usr/local/lib/python2.7/urllib2.py”,第1170行,打开 r=h.getresponse(缓冲=True) getresponse中的文件“/usr/local/lib/python2.7/httplib.py”,第1027行 response.begin() 文件“/usr/local/lib/python2.7/httplib.py”,第407行,在begin中 版本、状态、原因=self.\u读取\u状态() 文件“/usr/local/lib/python2.7/httplib.py”,第365行,处于读取状态 line=self.fp.readline() readline中的文件“/usr/local/lib/python2.7/socket.py”,第447行 数据=self.\u sock.recv(self.\r bufsize) 键盘中断
编辑 我让我的剧本通宵播放。我不知道到底花了多长时间(虽然超过五分钟),但脚本最终放弃了,并给了我一个stacktrace:

Traceback (most recent call last): File "honsapp/own3dStreamsUpdater.py", line 260, in newInfo() File "honsapp/own3dStreamsUpdater.py", line 172, in newInfo result = updateStreamInfo(stream) File "honsapp/own3dStreamsUpdater.py", line 53, in updateStreamInfo streamInfo = getStreamInfo(stream) File "/root/Dropbox/Projects/honstreams/honsapp/own3d.py", line 98, in getStreamInfo connection = urllib2.urlopen(request, timeout=10) File "/usr/local/lib/python2.7/urllib2.py", line 126, in urlopen return _opener.open(url, data, timeout) File "/usr/local/lib/python2.7/urllib2.py", line 394, in open response = self._open(req, data) File "/usr/local/lib/python2.7/urllib2.py", line 412, in _open '_open', req) File "/usr/local/lib/python2.7/urllib2.py", line 372, in _call_chain result = func(*args) File "/usr/local/lib/python2.7/urllib2.py", line 1199, in http_open return self.do_open(httplib.HTTPConnection, req) File "/usr/local/lib/python2.7/urllib2.py", line 1170, in do_open r = h.getresponse(buffering=True) File "/usr/local/lib/python2.7/httplib.py", line 1027, in getresponse response.begin() File "/usr/local/lib/python2.7/httplib.py", line 407, in begin version, status, reason = self._read_status() File "/usr/local/lib/python2.7/httplib.py", line 371, in _read_status raise BadStatusLine(line) httplib.BadStatusLine: '' 回溯(最近一次呼叫最后一次): 文件“honsapp/own3dStreamsUpdater.py”,第260行,在 newInfo() 文件“honsapp/own3dStreamsUpdater.py”,第172行,在newInfo中 结果=updateStreamInfo(流) updateStreamInfo中第53行的文件“honsapp/own3dStreamsUpdater.py” streamInfo=getStreamInfo(流) 文件“/root/Dropbox/Projects/honstreams/honsapp/own3d.py”,第98行,在getStreamInfo中 连接=urllib2.urlopen(请求,超时=10) 文件“/usr/local/lib/python2.7/urllib2.py”,urlopen中的第126行 return\u opener.open(url、数据、超时) 文件“/usr/local/lib/python2.7/urllib2.py”,第394行,打开 响应=自身打开(请求,数据) 文件“/usr/local/lib/python2.7/urllib2.py”,第412行,打开 "开放", 文件“/usr/local/lib/python2.7/urllib2.py”,第372行,在调用链中 结果=func(*args) 文件“/usr/local/lib/python2.7/urllib2.py”,第1199行,在http\u open中 返回self.do_open(httplib.HTTPConnection,req) 文件“/usr/local/lib/python2.7/urllib2.py”,第1170行,打开 r=h.getresponse(缓冲=True) getresponse中的文件“/usr/local/lib/python2.7/httplib.py”,第1027行 response.begin() 文件“/usr/local/lib/python2.7/httplib.py”,第407行,在begin中 版本、状态、原因=self.\u读取\u状态() 文件“/usr/local/lib/python2.7/httplib.py”,第371行,处于读取状态 升起状态行(行) httplib.BadStatusLine:“”
您确定urlopen()调用挂起吗?因为如果调用成功,while循环不会终止。

这个脚本根本不会冻结,但它是一个很好的例子,说明了为什么不应该在疲劳时编写代码。本应尝试连接到API三次的循环将永远持续下去,因为我忘了在其中放置一个
break

这个问题太愚蠢了,我不会责怪你把它删掉

固定代码:

# Try three times to make contact
while True:
    try:
        # Connect to API 
        connection = urllib2.urlopen(request, timeout=10)
        xmlstring = connection.read()
        break
    except URLError as e:
        tries += 1
        if tries >= 3:
            sys.stderr.write(
                      'own3dStreamsUpdater: Fatal error: Repeated timeouts')
            exit()

的确也许如果你们打印xmlstring,你们会看到有价值的输出。我不明白你们的意思。stacktrace清楚地表明,它在等待键盘中断时冻结的点在
connection=urllib2.urlopen(request,timeout=10)
行中。更改该行下面的任何代码如何可能产生任何差异?此外,我还用其他信息更新了我的问题。stacktrace只指出您中断它的地方是在urlopen()调用中——这并不奇怪,因为循环中只有两条语句,urlopen()可能是较慢的一条。你有没有像安德鲁建议的那样在循环中加入打印声明?你可能已经让一位站长非常生气,因为你给他的网站添加了药物:)
# Try three times to make contact
while True:
    try:
        # Connect to API 
        connection = urllib2.urlopen(request, timeout=10)
        xmlstring = connection.read()
        break
    except URLError as e:
        tries += 1
        if tries >= 3:
            sys.stderr.write(
                      'own3dStreamsUpdater: Fatal error: Repeated timeouts')
            exit()