如何使用python下载时优雅地超时

时间:2009-03-01 23:44:39

标签: python exception-handling downloading

我在循环中下载了一大堆带有以下代码的文件:

try:
    urllib.urlretrieve(url2download, destination_on_local_filesystem)
except KeyboardInterrupt:
    break
except:
    print "Timed-out or got some other exception: "+url2download

如果在刚刚启动连接时服务器在URL url2download上超时,则会正确处理最后一个异常。但有时服务器响应,并开始下载,但服务器太慢,即使一个文件也需要几个小时,最终会返回如下内容:

Enter username for Clients Only at albrightandomalley.com:
Enter password for  in Clients Only at albrightandomalley.com:

并挂起(虽然如果通过浏览器下载相同的链接,则无法使用用户名/密码)。

我在这种情况下的意图是 - 跳过这个文件然后转到下一个文件。问题是 - 怎么做?有没有办法在python中指定下载一个文件可以工作多长时间,如果已经花费了更多时间,打断并继续前进?

4 个答案:

答案 0 :(得分:8)

尝试:

import socket

socket.setdefaulttimeout(30)

答案 1 :(得分:4)

如果您不仅限于开箱即用的python附带内容,那么urlgrabber模块可能会派上用场:

import urlgrabber
urlgrabber.urlgrab(url2download, destination_on_local_filesystem,
                   timeout=30.0)

答案 2 :(得分:3)

讨论了这个here。注意事项(除了他们提到的那些):我还没有尝试过,他们使用的是urllib2,而不是urllib(这对你来说会有问题吗?)(实际上,现在我想一想,这种技术也可能适用于urllib

答案 3 :(得分:2)

关于超时功能,这个问题更为笼统: How to limit execution time of a function call in Python

我已经使用我在那里的答案中描述的方法来编写等待文本函数,该函数超时以尝试自动登录。如果您想要类似的功能,可以在这里引用代码:

http://code.google.com/p/psftplib/source/browse/trunk/psftplib.py