Получение эофиррора вместе со исключениями при использовании ftplib
Вопрос
Я хочу использовать ftplib (и, возможно, ftputil) для выполнения автоматического синхронизации файлов FTP. У меня есть пара серверов, чтобы проверить это на данный момент, но, хотя у меня успешный разговор с обоими серверами, я получаю eoFerror-s с каждым ответом ошибки. Например: если я попытаюсь войти в систему с неправильным пользователем/проходом, я получу ответ 530 со всем ... но я также получу эооферрор; Если я вхожу в систему с правильным пользователем/проходом или попытаюсь Dir () после этого и т. Д., Я не получаю эоооретрора.
Похоже, появляется только с сообщениями об ошибках. Я сильно подозреваю, что это может быть вызвано серверами, а не Python: я не нашел никакого упоминания об этом вопросе в другом месте. У меня, однако, очень мало контроля над настройкой сервера.
Я прошу идеи:
- Вы знаете, что может вызвать ошибку в первую очередь?
- Если это сервер, не могли бы вы быть более конкретными? Я не узнаю, смогу ли я что -нибудь с этим поделать, пока не узнаю, что это такое ...
- Как вы думаете, я должен справиться с этим? Я думаю, я мог бы добавить
except EOFError: pass
Прежде чем каждый раз я обращаюсь к исключению, но если у вас есть лучшие/аккуратные идеи, я хотел бы услышать их.
Спасибо!
Решение
Серверы отправляют EOF
Чтобы сказать вам, что они прекратили соединение.
Вы должны относиться к этому не иначе, чем к любому другому событию отключения, за исключением того, что, очевидно, вам нужно справиться с этим с except EOFError
.
Смотрите источник, из 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
Эооферрор поднимается только тогда, когда readline()
На подключении возвращает пустую линию, о которой указывает комментарий, является событием отключения.
Измените в вашем комментарии:
Сервер не отправляет пустую линию. readline()
возвращает все в следующее \n
или же \r
или же \r\n
Или все Abouve в зависимости от того, как он настроен. В таком случае, нечего читать Потому что конец файла был достигнут. Это вызывает readline()
к возвращаться Пустая линия, это не значит, что была прочитана пустая линия. Если прочитана пустая линия, readline()
вернет символ, который закончил линию (\n
или же \r
или же \n\r
).
Если вы не получите исключение при использовании ftputil, это потому, что он обрабатывает его внутри.