使用ftplib时获取EOFError以及异常

时间:2011-07-25 14:59:32

标签: python ftp ftplib eoferror ftputil

我正在研究使用ftplib(可能还有ftputil)进行一些自动FTP文件同步。我现在有几个服务器来测试这个,但是,当我与两个服务器成功对话时,我会收到每个错误回复的EOFError-s。例如:如果我尝试使用不正确的用户/通行证登录,我会得到530响应的所有内容......但我也得到了一个EOFError;如果我使用正确的用户/通行证登录或在这样做之后尝试dir()等,我就得不到EOFError。

似乎只出现错误消息。我强烈怀疑这可能是由服务器而不是python引起的:我没有在其他地方找到任何关于这个问题的提及。但是,我几乎无法控制服务器设置。

我在征求意见:

  • 你知道什么原因可能导致错误吗?
  • 如果是服务器端,你可以更具体一点吗?在我知道它是什么之前,我不知道我是否能够做任何事情......
  • 您认为我应该如何处理?我想我可以在每次处理异常之前添加except EOFError: pass,但如果你有更好/更好的想法,我很乐意听到它们。

谢谢!

1 个答案:

答案 0 :(得分:5)

服务器正在发送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()返回空行时才会引发EOFError,注释表明这是一个断开事件。

编辑您的评论:

服务器不发送空行。 readline()会将所有内容返回到下一个\n\r\r\n或全部内容,具体取决于其配置方式。在这种情况下,无需阅读,因为已到达文件的末尾。这会导致readline() 返回一个空白行,这并不意味着已读取空白行。如果已读取空行,readline()将返回结束该行的字符(\n\r\n\r)。

如果在使用FTPUtil时没有得到异常,那是因为它在内部处理它。