EffError zusammen mit Ausnahmen bei der Verwendung von FTPLIB erhalten
Frage
Ich möchte FTPLIB (und möglicherweise möglicherweise verwenden ftputil) für die automatisierte FTP -Dateisynchronisierung. Ich habe im Moment ein paar Server, gegen die ich dies testen kann, aber während ich ein erfolgreiches Gespräch mit beiden Servern habe, bekomme ich mit jeder Fehlerantwort eoFerror-s. Zum Beispiel: Wenn ich versuche, mich mit einem falschen Benutzer/Pass zu melden, bekomme ich die 530 -Antwort mit allem ... aber ich bekomme auch einen eoFerror. Wenn ich mich mit einem korrekten Benutzer/Pass anmelde oder versuche, danach usw. zu usw., bekomme ich kein EoFerror.
Es scheint nur mit Fehlermeldungen zu erscheinen. Ich vermute stark, dass dies eher von den Servern als von Python verursacht werden kann: Ich habe diese Ausgabe an anderer Stelle nicht erwähnt. Ich habe jedoch nur sehr wenig Kontrolle über das Server -Setup.
Ich bitte um Ideen:
- Wissen Sie, was den Fehler überhaupt verursachen könnte?
- Wenn es serverseitig ist, könnten Sie genauer sein? Ich werde nicht wissen, ob ich etwas dagegen tun kann, bis ich weiß, was es ist ...
- Wie denkst du sollte ich damit umgehen? Ich denke, ich könnte eine hinzufügen
except EOFError: pass
Vor jedem Mal, wenn ich eine Ausnahme mache, aber wenn Sie bessere/ordnere Ideen haben, würde ich sie gerne hören.
Vielen Dank!
Lösung
Die Server senden EOF
um Ihnen zu sagen, dass sie die Verbindung beendet haben.
Sie sollten dies nicht anders behandeln als jedes andere Trennungsereignis, außer dass Sie es offensichtlich mit damit umgehen müssen except EOFError
.
Siehe die Quelle von, von 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 wird nur angehoben, wenn readline()
Auf der Verbindung gibt eine leere Zeile zurück, die der Kommentar angibt, ein Trennverbot.
Bearbeiten Sie in Ihrem Kommentar:
Der Server sendet keine leere Zeile. readline()
Gibt alles bis zum nächsten zurück \n
oder \r
oder \r\n
oder alle Abouve, je nachdem, wie es konfiguriert ist. In diesem Fall, Es gibt nichts zu lesen Weil das Ende der Datei erreicht wurde. Dies bewirkt readline()
zu Rückkehr Eine leere Zeile bedeutet nicht, dass eine leere Zeile gelesen wurde. Wenn eine leere Zeile gelesen worden wäre, readline()
würde den Charakter zurückgeben, der die Linie beendete (\n
oder \r
oder \n\r
).
Wenn Sie bei Verwendung von FTputil nicht die Ausnahme erhalten, liegt das daran, dass sie intern behandelt.