twisted.protocols.ftp.FTPClient et différés
Question
Comme la plupart, il me faut un certain temps pour m'habituer à l'utilisation des Deferreds, mais j'y arrive lentement.Cependant, je ne comprends pas comment traiter une réponse, puis appeler une autre commande FTP. en utilisant la réponse traitée lors de l'utilisation du module FTP de Twisted.J'utilise le exemple de code FTP comme point de départ.
Je souhaite me connecter à un serveur FTP, obtenir tous les répertoires de niveau supérieur, puis saisir chacun d'eux et télécharger tous les fichiers.
Je connecte d'abord :
creator = ClientCreator(reactor, FTPClient, config.opts['username'], config.opts['password'], passive=config.opts['passive'])
creator.connectTCP(config.opts['host'], config.opts['port']).addCallback(connectionMade).addErrback(connectionFailed)
reactor.run()
Il se connecte avec succès, donc mon connectionMade
la fonction est appelée :
def connectionMade(ftpClient):
# Get a detailed listing of the current directory
fileList = FTPFileListProtocol()
d = ftpClient.list('.', fileList)
d.addCallbacks(getSortedDirectories, fail, callbackArgs=(fileList,))
d.addCallback(enterDirs)
Comme vous le voyez, je fais la queue getSortedDirectories
et puis enterDirs
.
def getSortedDirectories(result, fileListProtocol):
# Go through all directories from greatest to least
dirs = [directory for directory in sorted(fileListProtocol.files, reverse=True) if directory['filetype'] == 'd']
return dirs
Ma question est la suivante : comment puis-je parcourir les répertoires dans enterDirs
?
def enterDirs(dirs):
for directory in dirs:
print "We'd be entering '%s' now." % directory
Dois-je passer ftpClient
à enterDirs
comme fileList
est transmis à getSortedDirectories
et ensuite faire mes demandes de téléchargement ?
d.addCallback(enterDirs, callbackArgs=(ftpClient,))
def enterDirs(dirs, ftpClient):
for directory in dirs:
fileList = FTPFileListProtocol()
d = ftpClient.list(directory, fileList)
d.addCallbacks(downloadFiles, fail, callbackArgs=(directory, fileList, ftpClient))
def downloadFiles(result, directory, fileListProtocol, ftpClient):
for f in fileListProtocol.files if f.filetype == '-':
fileConsumer = FileConsumer()
ftpClient.retrieveFile(os.path.join(directory['filename'], file['filename']), fileConsumer)
Est-ce la meilleure approche ?
La solution
Dois-je passer FTPClient à des enterdirs comme FileList est transmis à GetSortedDirectries et ensuite faire mes demandes de téléchargement?...Est-ce la meilleure approche?
Je pense que passer explicitement l'objet client comme argument est en effet la meilleure approche - surtout, c'est sobre et élégant.La principale alternative serait de coder une classe et de ranger l'objet client dans une variable d'instance, ce qui semble un peu plus fastidieux ;utiliser une variable globale à cet effet serait, à mon avis, l'alternative la moins souhaitable (moins il y a de variables globales, mieux c'est !-).