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!

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top