Обратные вызовы ftplib не работают - Python 3 - PullRequest
2 голосов
/ 26 ноября 2011

Я искал везде и не могу найти решение этой проблемы, ftplib storbinary callbacks.Я впервые использую обратные вызовы, так что это может быть что-то глупое, у меня есть некоторый код, который должен вызывать мою функцию каждый раз, когда загружается 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

Всякий раз, когда это выполняется, обратный вызов выполняется только один раз, даже для файла размером 10 МБ.Что я делаю неправильно?Заранее спасибо

1 Ответ

1 голос
/ 26 ноября 2011

Обратный вызов, как следует из названия, - это когда вы говорите некоторому коду (ftplib) перезвонить вам.Вы сами вызвали функцию ftpcallback и передали ее возвращаемое значение (которое None, потому что оно ничего не return) методу storbinary.

Вместо этого вы хотитетолько передавать объект функции при вызове storbinary и позволить ftplib вызывать эту функцию для вас.Вы не хотите называть это сами.Следовательно, вам нужно избавиться от (...).

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.ftpcallback на storbinary звонок.Тогда вы можете просто использовать self.intid внутри метода.

...