2010-08-10 77 views
8

我试图使用ftplib获取文件列表并下载自上次检查以来的任何新文件。我试图运行到目前为止的代码是:Python ftplib超时

#!/usr/bin/env python 
from ftplib import FTP 
import sys 

host = 'ftp.***.com' 
user = '***' 
passwd = '***' 

try: 
    ftp = FTP(host) 
    ftp.login(user, passwd) 
except: 
    print 'Error connecting to FTP server' 
    sys.exit() 

try: 
    ftp.retrlines('LIST') 
except: 
    print 'Error fetching file listing' 
    ftp.quit() 
    sys.exit() 

ftp.quit() 

每当我运行它时,它会超时,当我尝试检索列表。有任何想法吗?

回答

9

最有可能是主动和被动模式之间的冲突。请确保以下条件之一为真:

  1. 服务器支持PASV模式,您的客户端设置PASV模式
  2. 如果服务器不支持被动模式,那么你的防火墙必须支持主动模式的FTP传输。

编辑:我看了看文档,发现在Python 2.1和更高版本中默认是被动模式。你在和哪个服务器通话,并且你知道它是否支持被动模式?

在主动模式下(非PASV),客户端发送PORT命令告诉服务器在该端口上启动DATA连接,这要求防火墙知道PORT命令,以便它可以将传入的DATA连接转发给您 - 很少有防火墙支持这一点。在被动模式下,客户端打开DATA连接,服务器使用它(服务器在打开数据连接时是“被动的”)。

为防万一您不使用被动模式,请执行ftp.set_pasv(True)并查看是否有所作为。

+1

你说得对,这是模式的问题。我试图与之交谈的服务器需要Active。谢谢您的帮助! – blcArmadillo 2010-08-10 18:37:25

10

如果被动模式失败由于某种原因,尝试:

ftp.set_pasv(False) 

使用Active模式。