2017-10-30 14 views
0
def download(self): 
    ftp = self.connect() 
    try: 
     size = ftp.size(filename=self.filename) 
     print "Total size of {filename} is {size}".format(filename=self.filename, size=size) 
     written_till_now = 0 
     def handle(bytes): 
      f.write(bytes) 
      print "written bytes: {}".format(bytes) 

     with open(self.filename, 'wb') as f: 
      ftp.retrbinary('RETR {}'.format(self.filename), handle) 
    except (socket.error, error_perm) as e: 
     raise DownloaderException("Error in downloading file {filename}: {message}".format(filename=self.filename, message=str(e))) 
    except EOFError as e: 
     print "file {filename} downloaded successfully".format(filename=self.filename) 

現在ダウンロードしているデータの量を把握し、ダウンロードしたすべてのデータストリームについて追加の処理を行いたいと思います。入れ子関数内で親変数にアクセスするPython

download機能の中にhandle関数を作成しました。

Python ftblip.retrbinaryは、指定されたコールバックにデータを提供します。私の場合はhandleしかし何とか実行されていません。

また、ネストされた関数については、変数の範囲を理解していません。私の理解では、私はそれらを変更していない限り、子スコープの親スコープで定義された変数を使用することができます。しかし、この場合fはオブジェクトであり、私はむしろそのメソッドを呼び出すことを変更していませんwrite。私が何かを逃している場合は私を修正してください。

+0

外からもありません。 –

+0

私はそれを取り入れています。後で私はそれにかかるプログレスバーを作ります。変数 '' 'written_till_now'''は私がアクセスしてインクリメントします –

+0

私は1バイトも取得していないので、そのと思います。しばらくすると例外をスローして接続を拒否します。 –

答えて

1

handle関数は、スコープ付きf変数にアクセスできません。代わりに開いたファイルを直接handleに渡すことができます。

def handle(fp, bytes): 
    fp.write(bytes) 
    print "written bytes: {}".format(bytes) 

with open(self.filename, 'wb') as f: 
    ftp.retrbinary('RETR {}'.format(self.filename), lambda b: handle(f, b)) 
+0

' '' lambda b: ''は、ftpが '' b'''を使うことを意味します変数? –

+1

これは、コールバック関数が単一の引数をとり、これを 'b'と呼ぶことを意味します。 –

+0

ありがとうございます –

関連する問題