Ottenere EOFError con eccezioni quando si utilizza ftplib
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!
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.