Python:控制超时长度

时间:2010-03-01 12:34:01

标签: python

我在脚本中运行的代码类似于以下代码:

try:
    s = ftplib.FTP('xxx.xxx.xxx.xxx','username','password')

except: 
    print ('Could not contact FTP serer')
    sys.exit()

如果FTP站点无法访问,脚本几乎似乎“挂起”...在sys.exit()似乎被调用之前平均需要大约75秒......我知道75秒可能非常主观的,并依赖于系统运行...但有没有办法让python只试一次,如果不成功,立即退出?我使用的平台是Mac OS X 10.5 / python 2.5.1。

5 个答案:

答案 0 :(得分:7)

从2.6开始,FTP constructor有一个可选的timeout参数:

  

class ftplib.FTP([host[, user[, passwd[, acct[, timeout]]]]])

     

返回FTP类的新实例。当给出主机时,方法调用connect(host)。当给出用户时,另外调用login(user,passwd,acct)方法(其中passwd和acct默认为空字符串,如果没有给出)。 可选的timeout参数指定阻塞操作的超时秒数,如连接尝试(如果未指定,将使用全局默认超时设置)。

     

在2.6版中更改:添加了超时。

从版本2.3及更高版本开始,可以使用全局默认超时:

  

socket.setdefaulttimeout(timeout)

     

为新套接字对象设置浮动秒的默认超时。值为None表示新套接字对象没有超时。首次导入套接字模块时,默认值为None。

     

2.3版中的新功能。

答案 1 :(得分:2)

因为您使用的是python 2.5,所以可以使用以下命令为所有套接字操作(包括FTP请求)设置全局超时:

socket.setdefaulttimeout()

(这是在Python 2.3中添加的)

答案 2 :(得分:1)

答案 3 :(得分:1)

如果查看doc,就会出现超时参数。

class ftplib.FTP([host[, user[, passwd[, acct[, timeout]]]]])¶

也许你可以使用它。

答案 4 :(得分:1)

对那些建议使用'socket.setdefaulttimeout()'的评论。在内部,ftplib使用sock.makefile()。根据python文档,你不应该混淆makefile()和超时。特别:   http://docs.python.org/library/socket.html#socket.socket.makefile

当然,我不能说我已经看到任何问题,只是它让我担心。