質問
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()
これを実行するたびに、リスティングを取得しようとするときはいつでも出ます。何か案は?
解決
おそらく、アクティブモードとパッシブモードの間の競合です。次のいずれかが真であることを確認してください。
- サーバーはPASVモードをサポートし、クライアントがPASVモードを設定しています
- サーバーがパッシブモードをサポートしていない場合、ファイアウォールはアクティブモードFTP転送をサポートする必要があります。
編集:ドキュメントを見て、Python 2.1以降ではデフォルトがパッシブモードであることがわかりました。どのサーバーと話しているのか、パッシブモードをサポートしているかどうかを知っていますか?
アクティブモード(非PASV)では、クライアントはポートコマンドを送信し、サーバーにそのポートのデータ接続を開始するようにサーバーに送信します。これにより、ファイアウォールはポートコマンドに注意する必要があります。これをサポートします。パッシブモードでは、クライアントがデータ接続を開き、サーバーはそれを使用します(サーバーはデータ接続を開く際に「パッシブ」です)。
パッシブモードを使用していない場合に備えて、 ftp.set_pasv(True)
そして、それが違いを生むかどうかを確認します。
他のヒント
何らかの理由でパッシブモードが失敗している場合は、次のことを試してください。
ftp.set_pasv(False)
アクティブモードを使用します。
所属していません StackOverflow