Obtener eoferror junto con excepciones cuando se usa FTPLIB
Pregunta
Estoy buscando usar ftplib (y posiblemente ftputil) para hacer una sincronización automatizada de archivos FTP. Tengo un par de servidores para probar esto en este momento, pero, aunque tengo una conversación exitosa con ambos servidores, obtengo eoferror-s con cada respuesta de error. Por ejemplo: si trato de iniciar sesión con un usuario/pase incorrecto, obtendré la respuesta 530 con todo ... pero también obtengo un eoferror; Si inicio sesión con un usuario/paso correcto o intento 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 Python: no he encontrado ninguna mención de este problema en otro lugar. Sin embargo, tengo muy poco control sobre la configuración del servidor.
Estoy pidiendo ideas:
- ¿Sabes qué podría estar causando el error en primer lugar?
- Si es el 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 un
except EOFError: pass
Antes de cada vez que manego una excepción, pero si tienes ideas mejores/más finas, me encantaría escucharlas.
¡Gracias!
Solución
Los servidores están enviando EOF
para decirte 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
.
Ver la fuente, de 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 plantea cuando readline()
En la conexión devuelve una línea en blanco, que el comentario indica es un evento de desconexión.
Edite en su comentario:
El servidor no envía una línea vacía. readline()
Devuelve todo al 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 alcanzado el final del archivo. Esto causa readline()
a devolver Una línea en blanco, no significa que se haya leído una línea en blanco. Si se había leído una línea en blanco, readline()
devolvería el personaje que terminó la línea (\n
o \r
o \n\r
).
Si no obtiene la excepción cuando usa ftputil, es porque la maneja internamente.