Получение EOFError вместе с исключениями при использовании ftplib - PullRequest
2 голосов
/ 25 июля 2011

Я изучаю использование ftplib (и, возможно, ftputil ) для автоматической синхронизации файлов FTP.В данный момент у меня есть пара серверов для тестирования, но, хотя у меня есть успешный разговор с обоими серверами, я получаю EOFError-s с каждым ответом об ошибке.Например: если я попытаюсь войти в систему с неверным пользователем / паролем, я получу ответ 530 со всем ... но я также получу EOFError;если я вхожу в систему с правильным пользователем / паролем или пытаюсь выполнить dir () после этого и т. д., я не получаю EOFError.

Кажется, он появляется только с сообщениями об ошибках.Я сильно подозреваю, что это может быть вызвано серверами, а не python: я не нашел упоминаний об этой проблеме в другом месте.Я, однако, очень мало контролирую настройку сервера.

Я прошу идеи:

  • Знаете ли вы, что могло вызвать ошибку в первую очередь?
  • Если это на стороне сервера, не могли бы вы быть более конкретным?Я не буду знать, смогу ли я что-нибудь с этим сделать, пока не узнаю, что это такое ...
  • Как вы думаете, как мне справиться с этим?Я думаю, я мог бы добавить except EOFError: pass перед каждым разом, когда я обрабатываю исключение, но если у вас есть идеи получше / аккуратнее, я бы хотел их услышать.

1 Ответ

5 голосов
/ 25 июля 2011

Серверы отправляют 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

EOFError возникает только тогда, когда readline() на соединении возвращает пустую строку, которая в комментарии указывает на событие отключения.

Редактируйте свой комментарий:

Сервер не отправляет пустую строку. readline() возвращает все до следующего \n или \r или \r\n или всего вышеупомянутого, в зависимости от того, как оно настроено. В этом случае нечего читать , потому что достигнут конец файла. Это приводит к тому, что с readline() до возвращается пустая строка, это не означает, что пустая строка была прочитана. Если бы была прочитана пустая строка, readline() вернул бы символ, который закончил строку (\n или \r или \n\r).

Если вы не получите исключение при использовании FTPUtil, то это потому, что он обрабатывает его внутренне.

...