Предполагая, что вы используете FTPClient
из twisted.protocols.ftp
... и я определенно сомневаюсь, прежде чем противоречить JP ..
Похоже, что класс FileConsumer
вы переходите на retrieveFile
будет адаптирован к IProtocol
на twisted.internet.protocol.ConsumerToProtocolAdapter
, что не вызывает unregisterProducer
, поэтому FileConsumer
не закрывает объект файла.
Я выбрал быстрый протокол, который вы можетеиспользовать для получения файлов.Я думаю, что он должен открывать файл только при необходимости.Полностью непроверенный, вы использовали бы его вместо FileConsumer
в приведенном выше коде, и вам не понадобится addCallback
.
from twisted.python import log
from twisted.internet import interfaces
from zope.interface import implements
class FTPFile(object):
"""
A consumer for FTP input that writes data to a file.
@ivar filename: a filename to be opened for writing.
"""
implements(interfaces.IProtocol)
def __init__(self, filename):
self.fObj = None
self.filename = filename
def makeConnection(self,transport)
self.fObj = open(self.filename,'wb')
log.info('Opened %s for writing' % self.filename)
def connectionLost(self,reason):
self.fObj.close()
log.info('Closed %s' % self.filename)
def dataReceived(self, bytes):
self.fObj.write(bytes)