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. I changed getpart and callback like this, now it works:
def getpart_callback(self, received): print "received a packet" if self.cnt <= 0: return True else: print 'received packet, [0] = %x' % ord(received[0]) self.outf.write(received) self.cnt -= len(received) 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() -- http://mail.python.org/mailman/listinfo/python-list