首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >twisted.protocols.ftp.FTPClient和Deferreds

twisted.protocols.ftp.FTPClient和Deferreds
EN

Stack Overflow用户
提问于 2010-07-22 21:30:30
回答 1查看 1.1K关注 0票数 1

和大多数人一样,我需要一段时间才能习惯使用Deferreds,但我正在慢慢地达到这个目的。但是,我不清楚如何处理响应,然后在使用Twisted的FTP模块时使用已处理的响应调用另一个FTP命令。我用示例FTP代码作为我的起点。

我想连接到FTP服务器,获取所有顶级目录,然后输入每个目录并下载所有文件。

首先,我连接:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
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)

正如您所看到的,我将getSortedDirectoriesenterDirs排队。

代码语言:javascript
复制
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中的目录

代码语言:javascript
复制
def enterDirs(dirs):
    for directory in dirs:
        print "We'd be entering '%s' now." % directory

我应该把ftpClient传递给enterDirs,就像fileList传递给getSortedDirectories一样,然后发出下载请求吗?

代码语言:javascript
复制
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)

这是最好的办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-22 23:57:24

我应该把ftpClient传递给enterDirs,就像fileList传递给getSortedDirectories,然后发出下载请求吗?这是最好的办法吗?

我确实认为将客户机对象显式地作为一个参数传递确实是最好的方法--大多数情况下,它是多余的和优雅的。主要的选择是编写类并将客户端对象保存到实例变量中,这似乎有点麻烦;在我看来,使用全局变量是最不可取的选择(全局变量越少,越好!-)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3313663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档