5

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

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

我在征求意见:

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

谢谢!

4

1 回答 1

6

服务器正在发送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 时没有出现异常,那是因为它在内部处理它。

于 2011-07-25T15:34:27.260 回答