2010-08-10 482 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模式。