2016-12-02 8 views
0

現在、私はPythonのftplibライブラリを使ってftpサーバにファイルをアップロードしようとしています。ファイルには、(〜400メガバイト)比較的小さいですが、私のスクリプトは常に同じようにクラッシュ:Python ftplib uploads failed with error 421

total_size = 492917709 
Traceback (most recent call last): 
    File "ftpmule.py", line 83, in <module> 
    dest_ftp.storbinary('RETR %s' % base_fn, fhandle, 1024) 
    File "/usr/lib/python2.6/ftplib.py", line 233, in voidresp 
    resp = self.getresp() 
    File "/usr/lib/python2.6/ftplib.py", line 266, in getresp 
    raise error_temp, resp 
ftplib.error_temp: 421 Data timeout. Reconnect. Sorry. 

関連するコード:あなたのコメントから

dest_ftp = FTP(ftp_dest_host) 
dest_ftp.login(ftp_user, ftp_pass) 
dest_ftp.cwd(ftp_dest_path) 

filename = "file.zip" 

with open(filename, 'rb') as fhandle: 
    dest_ftp.storbinary('RETR %s' % filename, fhandle, 1024) 
+1

あなたが古き良きコマンドラインのftp(パイソンの外)でファイルを転送しようとしたことがあり、それが動作しませんか、同じ失敗ですか? –

+0

はい - アップロードは正常に動作し、かなり高速です(10.59秒@ 45390.6 kB/s)。私が気付いたのは、転送が開始されたときに「200 PORTコマンドが成功しました.PASVの使用を検討してください」ということです。私は、ftplibがデフォルトでPASVを使用していることは確かです。 – tparrott

+1

そして、コマンドラインのftpでパッシブモードを強制しようとしましたか? –

答えて

1

、サーバはパッシブモードをサポートしていません。あなたが明示的set_pasv(False)でそれを無効にする必要がありますので、Pythonのftplibのは、2.2以降、デフォルトでパッシブモードを使用しています。

dest_ftp = FTP(ftp_dest_host) 
dest_ftp.login(ftp_user, ftp_pass) 
dest_ftp.cwd(ftp_dest_path) 
dest_ftp.set_pasv(False) 

filename = "file.zip" 

with open(filename, 'rb') as fhandle: 
    dest_ftp.storbinary('RETR %s' % filename, fhandle, 1024)