【发布时间】:2010-07-22 21:30:30
【问题描述】:
像大多数人一样,我需要一段时间才能习惯使用 Deferreds,但我正在慢慢适应。但是,我不清楚在使用 Twisted 的 FTP 模块时如何处理响应,然后调用另一个 FTP 命令使用处理后的响应。我使用example FTP code 作为我的起点。
我想连接到 FTP 服务器,获取所有顶级目录,然后输入每个目录并下载所有文件。
首先我连接:
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()
连接成功,所以我的connectionMade函数被调用:
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)
如你所见,我排队getSortedDirectories,然后是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
我的问题是,如何浏览enterDirs 中的目录?
def enterDirs(dirs):
for directory in dirs:
print "We'd be entering '%s' now." % directory
我是否应该将ftpClient 传递给enterDirs,就像将fileList 传递给getSortedDirectories 然后发出我的下载请求?
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)
这是最好的方法吗?
【问题讨论】:
标签: python ftp twisted deferred