像大多数人一样,我需要一段时间才能习惯使用延迟,但我慢慢地做到了。但是,我不清楚如何处理一个响应,然后在使用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
函数:
如您所见,我排队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
被传递给{
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)
这是最好的方法吗?在
我确实认为将client对象显式地作为参数传递确实是最好的方法大多数情况下,它既简单又优雅。主要的替代方法是编写一个类并将客户机对象存储到一个实例变量中,这看起来有点麻烦;在我看来,使用全局变量是最不可取的选择(全局变量越少越好!-). 在
相关问题 更多 >
编程相关推荐