[Twisted-Python] need help for twisted FTPClient
柳锴
ioscas at gmail.com
Thu Feb 12 02:53:28 MST 2009
thanks for your reply, i will check the codes..
2009/2/11 Jean-Paul Calderone <exarkun at divmod.com>
> On Wed, 11 Feb 2009 11:43:07 +0800, 柳锴 <ioscas at gmail.com> wrote:
>
>> hello, everyone:
>>
>> I'm new to twisted and ftp protocol. for some purpose, i need a python
>> ftp client to do list, get, put, remove operations upon a FTP server which
>> is implemented with twisted.
>> here is my codes, testing for 'get' passed, but 'put' failed. i checked
>> the api of storeFile, abd got these:
>>
>> [snip]
>>
>> but i don't know how to handle it, :)
>> sorry for the rubbish codes, but i really need help from you guys, it's
>> hard to find some useful info from twisted official doc,
>> Any suggestion on how to write a nice ftp client with twisted is welcome.
>> Thanks in advance.
>>
>
> The most obvious problem with the code is that it uses reactor.run and
> reactor.stop too much. You can start and stop the reactor exactly once.
>
> IOSCAS
>>
>>
>> ______________________________________________________________________________
>>
>> from twisted.protocols.ftp import FTPClient, FTPFileListProtocol
>> from twisted.internet.protocol import Protocol, ClientCreator
>> from twisted.python import usage
>> from twisted.internet import reactor, defer
>>
>> class SaveFile(Protocol):
>> '''
>> save the ftp file to local filesystem
>> '''
>> def __init__(self, output):
>> self.fout = open(output, 'w')
>>
>> def dataReceived(self, data):
>> self.fout.write(data)
>> self.fout.close()
>>
>
> This is also probably wrong. dataReceived may be called multiple times.
> You can't close the output file until you've received all the data. I'm
> not sure, but connectionLost is probably called when all data has been
> received (or if there is an error receiving the data).
>
> class FTP:
>> '''
>> a simple ftp client
>> '''
>> def __init__(self, host, port):
>> '''
>> init
>> '''
>> self.__host = host
>> self.__port = port
>> self.__username = 'aaa'
>> self.__passwd = 'bbb'
>> self.__passive = 1
>>
>> def __get(self, ftp_client, src, des):
>> '''
>> '''
>> save_file = SaveFile(des)
>> d = ftp_client.retrieveFile(src, save_file)
>> d = ftp_client.quit()
>> d.addCallback(lambda result: reactor.stop())
>> return d
>>
>
> Don't stop the reactor here. Stopping the reactor means your program is
> basically done and you don't want to do anything else with Twisted.
>
> def get(self, src, des):
>> '''
>> get src file from ftp server, store it in des
>> '''
>> creator = ClientCreator(reactor, FTPClient, self.__username,
>> self.__passwd, self.__passive)
>> defer = creator.connectTCP(self.__host,
>> self.__port).addCallback(self.__get, src, des)
>> reactor.run()
>> return defer.result
>>
>
> Don't start the reactor here. Start the reactor in the "main" part of your
> program. Also, don't access "defer.result". Instead, just return "defer".
>
>
>> def __put(self, ftp_client, src, des):
>> '''
>> '''
>> source_file = os.path.basename(src)
>> target_dir = os.path.dirname(des)
>> ftp_client.changeDirectory(target_dir)
>> d = ftp_client.storeFile(src)
>> d = ftp_client.quit()
>> d.addCallback(lambda result: reactor.stop())
>> return d
>>
>
> Again, don't use stop here.
>
> def put(self, src, des):
>> '''
>> put src file to ftp server, store it in des
>> '''
>> creator = ClientCreator(reactor, FTPClient, self.__username,
>> self.__passwd, self.__passive)
>> defer = creator.connectTCP(self.__host,
>> self.__port).addCallback(self.__put, src, des)
>> reactor.run()
>> return defer.result
>>
>>
> And don't use run or .result here.
>
> Jean-Paul
>
>
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: </pipermail/twisted-python/attachments/20090212/44a9d504/attachment.html>
More information about the Twisted-Python
mailing list