Obtención de EOFError junto con excepciones al usar ftplib

Estoy estudiando el uso de ftplib (y posiblemente ftputil ) para realizar una sincronización automática de archivos FTP. Tengo un par de servidores para probar esto en este momento, pero mientras mantengo una conversación exitosa con ambos servidores, obtengo EOFError-s con cada respuesta de error. Por ejemplo: si bash iniciar sesión con un usuario / paso incorrecto, obtendré la respuesta 530 con todo … pero también obtengo un error EOFError; si inicio sesión con un usuario correcto / paso o trato de dir () después de hacerlo, etc., no obtengo EOFError.

Parece que solo aparece con mensajes de error. Sospecho que esto puede ser causado por los servidores en lugar de por Python: no he encontrado ninguna mención de este problema en ninguna otra parte. Sin embargo, tengo muy poco control sobre la configuración del servidor.

Estoy pidiendo ideas:

  • ¿Sabes lo que podría estar causando el error en primer lugar?
  • Si es del lado del servidor, ¿podría ser más específico? No sabré si podré hacer algo al respecto hasta que sepa qué es …
  • ¿Cómo crees que debería manejar esto? Supongo que podría agregar una except EOFError: pass antes de cada vez que maneje una excepción, pero si tiene ideas mejores / más ordenadas, me encantaría escucharlas.

¡Gracias!

    Los servidores envían EOF para avisarle que han terminado la conexión.

    Debe tratar esto de manera diferente a cualquier otro evento de desconexión, excepto que obviamente necesita manejarlo con except EOFError .

    Vea la fuente en http://svn.python.org/view/python/trunk/Lib/ftplib.py?view=markup

     # Internal: return one line from the server, stripping CRLF. # Raise EOFError if the connection is closed 182 def getline(self): 183 line = self.file.readline() 184 if self.debugging > 1: 185 print '*get*', self.sanitize(line) 186 if not line: raise EOFError 187 if line[-2:] == CRLF: line = line[:-2] 188 elif line[-1:] in CRLF: line = line[:-1] 189 return line 

    EOFError solo se genera cuando readline() en la conexión devuelve una línea en blanco, lo que el comentario indica es un evento de desconexión.

    Edita en re tu comentario:

    El servidor no envía una línea vacía. readline() devuelve todo hasta el siguiente \n o \r o \r\n o todo el abouve dependiendo de cómo esté configurado. En este caso, no hay nada que leer porque se ha llegado al final del archivo. Esto hace que readline() devuelva una línea en blanco, no significa que se haya leído una línea en blanco. Si se hubiera leído una línea en blanco, readline() devolvería el carácter que terminó la línea ( \n o \r o \n\r ).

    Si no obtiene la excepción al usar FTPUtil, es porque se maneja internamente.