Unable to abort a FTP command?

_wdx at 163.com _wdx at 163.com
Wed Jul 25 03:48:21 EDT 2007


Hi,
    I write the following script to retrieve a part of a large file
from a FTP site:

import ftplib

class ftp_getter(object):

    def __init__(self):
        self.handle = ftplib.FTP('ftp_server_address')
        self.handle.set_debuglevel(2)
        self.login()

    def login(self):
        self.handle.login('user', 'pass')
        self.handle.cwd('/temp1/')

    def quit(self, is_close = False):
        self.handle.quit()
        if is_close:
            self.handle.close()
            print 'ftp handle closed'

    def getpart_callback(self, received):
        print "received a packet"
        if self.cnt <= 0:
            if not self.outf.closed:
                self.outf.close()
            if not self.aborted:
                try:
                    self.handle.abort()
                    self.aborted = True
                except Exception,ex:
                    pass
        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.aborted = False
        self.handle.retrbinary('RETR ' + ftp_filename,
self.getpart_callback, 8192, rest)
        if not self.outf.closed:
            self.outf.close()

if __name__ == '__main__':
    g = ftp_getter()
    g.getpart('FILE_TO_RETRIEVE.DAT', 50000, 20, 'out.dat')
    g.quit(True)
    print "all done."

    As the last four lines shown, I want to connect to my FTP server,
retrieve 20 bytes starting at offset 50000 from FILE_TO_RETRIEVE.DAT,
and stop retrieving after more than 20 bytes have been received. It's
quite simple, but to my suprise, this code does not work.
"self.handle.abort()" have been executed and I got the expected
response from server(426),  but the RETR command does not seem to stop
at all. More and more data are received and getpart_callback method is
called again and again.
    Why the RETR command is not actually aborted? Can anyone help me?

    Thanks

    Xu Wang




More information about the Python-list mailing list