Domanda

sto cercando in uso ftplib (e possibilmente ftputil ) per fare alcuni automatizzata di file sincronizzazione FTP. Ho un paio di server per testare questo contro al momento, ma, mentre io sto avendo una conversazione di successo con entrambi i server, ottengo EOFError-S con ciascuna risposta di errore. Per esempio: se provo ad accedere con un utente / passaggio errato, mi metterò la risposta 530 con tutto ... ma ho anche ottenere un EOFError; se faccio il login con un corretto user / pass o provare a dir () dopo averlo fatto, ecc, non ottengo EOFError.

E sembra apparire solo con i messaggi di errore. Ho il forte sospetto questo può essere causato dai server piuttosto che python: Non ho trovato alcuna menzione di questo problema altrove. Io, invece, ho molto poco controllo sulla configurazione del server.

sto chiedendo idee:

  • Sai che cosa potrebbe causare l'errore, in primo luogo?
  • Se si tratta del lato server, potrebbe essere più preciso? Io non so se sarò in grado di fare nulla finché non so di cosa si tratta ...
  • Come pensi che devo gestire questo? Credo che avrei potuto aggiungere un except EOFError: pass prima che ogni volta che mi occupo di un'eccezione, ma se avete una migliore / più ordinato idee mi piacerebbe sentire loro.

Grazie!

È stato utile?

Soluzione

I server sono l'invio EOF di dirvi che hanno interrotto la connessione.

Si dovrebbe trattare questo non è diverso rispetto a qualsiasi altro evento di disconnessione, tranne che, ovviamente, è necessario gestire con except EOFError.

Vedere la fonte, da 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 viene generato solo quando readline() sulla connessione restituisce una riga vuota, che indica il commento è un evento di disconnessione.

Modifica in re tuo commento:

Il server non invia una riga vuota. readline() ritorna tutto fino al prossimo \n o \r o \r\n o tutte le abouve a seconda di come è configurato. In questo caso, non c'è niente da leggere perché la fine del file è stata raggiunta. Questo fa sì che readline() a ritorno una riga vuota, non significa una riga vuota è stato letto. Se una riga vuota era stato letto, readline() sarebbe tornato il carattere che si è conclusa la linea (o \n \r o \n\r).

Se non si ottiene l'eccezione quando si utilizza FTPUtil, che è perché gestisce internamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top