2016-06-13 53 views
0

ftplibを使用して、(64ビットWindows 7を実行している)コンピュータからLinuxサーバーに一連のファイルを転送しようとしています。プロセスは、テストコードのこのスニペットに似ている(サーバアドレス、ユーザ名、およびパスワードは明らかに、変更された):Pythonのftplibを介したファイル転送が非確定的にタイムアウトする

import ftplib 
import os.path 
import os 

host  = "some.ftp.server.com" 
username = "username" 
password = "password" 

outDir = "/some/output/directory" 

def transfer_files(): 
    ftp = ftplib.FTP(host, username, password) 

    ftp.cwd(outDir) 
    names = ftp.nlst() 
    if "transferred" not in names: 
     ftp.mkd("transferred") 
    ftp.cwd("transferred") 
    names = ftp.nlst() 

    # Transfrer arbitrary files to the server 
    filesToTransfer = os.listdir('.') 
    for fName in filesToTransfer: 
     if not os.path.isfile(fName): 
      continue 
     if fName in names: 
      ftp.delete(fName) 
     with open(fName, 'r') as f: 
      ftp.storbinary("STOR %s" % fName, f) 
     print fName 

    ftp.quit() 

    print "Done" 

if __name__ == "__main__": 
    transfer_files() 

私が見ている動作は、ほとんどのファイルを迅速かつ成功裏に移すということですが、ランダムにファイルの意志タイムアウトには、私は、プログラムを実行するたびに異なる

Traceback (most recent call last): 
    File "Test.py", line 37, in <module> 
    transfer_files() 
    File "Test.py", line 29, in transfer_files 
    ftp.storbinary("STOR %s" % base, f) 
    File "C:\Python27\Lib\ftplib.py", line 471, in storbinary 
    conn = self.transfercmd(cmd, rest) 
    File "C:\Python27\Lib\ftplib.py", line 376, in transfercmd 
    return self.ntransfercmd(cmd, rest)[0] 
    File "C:\Python27\Lib\ftplib.py", line 335, in ntransfercmd 
    conn = socket.create_connection((host, port), self.timeout) 
    File "C:\Python27\Lib\socket.py", line 575, in create_connection 
    raise err 
socket.error: [Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 

ファイルということ、それは、常に1つのファイルまたは別に発生するようです:代わりにアウト時間とは、以下の例外を発生させます。転送がランダムにタイムアウトするのはなぜですか、これを防ぐには何ができますか?

答えて

0

ネットワーク要求を一括して処理する場合、一定のタイムアウトを得るのは完全に正常です。予想されたものでもあります。タイムアウトが発生しないようにするのではなく、アプリケーションにロジックを追加して、タイムアウトが発生するケースを処理する必要があります。ファイルを一括してアップロードするので、おそらくその例外が発生したときにアップロードを再試行するように見えます。

+0

タイムアウト時間を1秒に変更し、成功するまで転送を再試行するように見えます。転送が "ランダムに"タイムアウトすると、何が起こっているのでしょうか? –

+0

すべてのネットワーク要求は、ワイヤ(またはWiFi、または光ファイバケーブル)を介して送信される一連のパケットに分解されます。タイムアウトは、コンピュータが相手方のコンピュータから、そのパケットを受け取ったという肯定応答を受信しなかったときに発生します。そのうちのいくつかは途中で失われたか、途中で応答が失われたためです。 ほとんどの目的のために、コンピュータプログラムは「理想的に」動作しますが、データ転送は物理的な世界の不完全さをもたらし、適切なデータ転送を妨げます。 –

関連する問題