我正在研究使用ftplib(可能还有ftputil)进行一些自动FTP文件同步。我现在有几个服务器来测试这个,但是,当我与两个服务器成功对话时,我会收到每个错误回复的EOFError-s。例如:如果我尝试使用不正确的用户/通行证登录,我会得到530响应的所有内容......但我也得到了一个EOFError;如果我使用正确的用户/通行证登录或在这样做之后尝试dir()等,我就得不到EOFError。
似乎只出现错误消息。我强烈怀疑这可能是由服务器而不是python引起的:我没有在其他地方找到任何关于这个问题的提及。但是,我几乎无法控制服务器设置。
我在征求意见:
except EOFError: pass
,但如果你有更好/更好的想法,我很乐意听到它们。谢谢!
答案 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时没有得到异常,那是因为它在内部处理它。