2

私はいたるところを調べましたが、この問題の修正、ftplibstorbinaryコールバックを見つけることができません。コールバックを使用するのはこれが初めてなので、何かばかげている可能性があります。8192バイトがアップロードされるたびに関数を呼び出すコードがあります(これが、調査後にコールバックが機能すると思う方法です)。

#In main thread
def ftpcallback(intid):
    ftpuploaded = transStatus[intid][3] + 8192 #transStatus[intid] equals 0 to start with
    if ftpuploaded > transStatus[intid][2]: ftpuploaded = transStatus[intid][2] #Is this needed? It's supposed to just keep the value below the file size
    transStatus[intid][3] = ftpuploaded
    print (transStatus[intid][3]) #Always outputs 8192
    print("Callback called")

#Not in main thread
#FTP and file open code

self.ftp.storbinary("STOR " + self.destname, self.f, 1, ftpcallback(self.intid)) #1 to (hopefully) spam the output more

#close FTP and file code

それが実行されるときはいつでも、コールバックは10MBのファイルであっても1回だけ実行されます。私は何が間違っているのですか?前もって感謝します

4

1 に答える 1

1

コールバックは、その名前が示すように、コードの一部(ftplib)にコールバックするように指示したときです。あなたがしたことは、ftpcallback自分で関数を呼び出し、その戻り値をメソッドに渡すことでした(これは何もNoneしないためです) 。returnstorbinary

代わりに、呼び出し時に関数オブジェクトのみを渡し、storbinaryftplibにこの関数を呼び出させます。あなたはそれを自分で呼びたくない。したがって、を取り除く必要があります(...)

intid = self.intid
def ftpcallback():
    ftpuploaded = transStatus[intid][3] + 8192  # transStatus[intid] equals 0 to start with
    if ftpuploaded > transStatus[intid][2]:
        ftpuploaded = transStatus[intid][2]  # Is this needed? It's supposed to just keep the value below the file size
    transStatus[intid][3] = ftpuploaded
    print(transStatus[intid][3])  # Always outputs 8192
    print("Callback called")

#FTP and file open code

self.ftp.storbinary("STOR " + self.destname, self.f, 1, ftpcallback)

ftplibのドキュメントには、コールバック引数については何も記載されていないため、コールバックを呼び出すときに、コールバックに引数を渡さないと思います。したがって、あなたは、つまり引数なしftpcallbackで呼び出すことができなければなりません。ftpcallback()そのため、引数を削除して関数の前にintid追加しました。intid = self.intid

これを行う別の方法は、クラスftpcallbackのメソッド()として定義し、呼び出しに渡すことです。次に、メソッド内で簡単に使用できます。def ftpcallback(self):self.ftpcallbackstorbinaryself.intid

于 2011-11-26T19:16:56.817 に答える