Unable to abort a FTP command?

Scott David Daniels Scott.Daniels at Acm.Org
Wed Apr 15 20:34:13 CEST 2009


_wdx at 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.Daniels at Acm.Org




More information about the Python-list mailing list