_...@163.com wrote:
Thank you. You are right, retrbinary did not notice I want to abort, so it won't break the recv loop and close data connection.... def getpart(self, ftp_filename, rest, cnt, out_filename): self.outf = open(out_filename, 'wb') self.cnt = cnt self.handle.voidcmd('TYPE I') conn = self.handle.transfercmd('RETR ' + ftp_filename, rest) while 1: data = conn.recv(8192) if not data: break if self.getpart_callback(data): try: self.handle.abort() break except: pass self.outf.close() self.handle.voidresp() conn.close()
How about: import logging ... def getpart(self, ftp_filename, rest, cnt, out_filename): with open(out_filename, 'wb') as outf: self.outf = outf self.cnt = cnt self.handle.voidcmd('TYPE I') conn = self.handle.transfercmd('RETR ' + ftp_filename, rest) data = conn.recv(8192) while data: if self.getpart_callback(data): try: self.handle.abort() break except BaseException, why: # "except BaseException as why:" if >= Py2.6 logging.error('%s: %s encountered' % ( (why.__class__.__name__, why)) if not isinstance(why, Exception): raise data = conn.recv(8192) self.handle.voidresp() conn.close() --Scott David Daniels scott.dani...@acm.org -- http://mail.python.org/mailman/listinfo/python-list