Получение эофиррора вместе со исключениями при использовании ftplib

StackOverflow https://stackoverflow.com/questions/6818091

Вопрос

Я хочу использовать 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, это потому, что он обрабатывает его внутри.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top