使用ftplib时出现EOFError和其他异常

5 投票
1 回答
11084 浏览
提问于 2025-04-16 22:13

我正在研究使用 ftplib(可能还会用到 ftputil)来进行一些自动化的 FTP 文件同步。目前我有几个服务器可以测试,虽然我和这两个服务器的连接都很顺利,但每次遇到错误回复时,我都会收到 EOFError 错误。例如:如果我用错误的用户名或密码登录,我会收到 530 的错误响应,所有信息都会显示出来……但我同时也会收到 EOFError;如果我用正确的用户名和密码登录,或者在登录后尝试 dir() 等操作,就不会出现 EOFError。

这个错误似乎只在出现错误信息时才会出现。我强烈怀疑这可能是服务器的问题,而不是 Python 的问题:我在其他地方没有找到关于这个问题的任何信息。不过,我对服务器的设置几乎没有控制权。

我想请教一下大家的想法:

  • 你知道这个错误最初可能是什么原因吗?
  • 如果是服务器的问题,你能具体说明一下吗?我在知道是什么问题之前,不知道自己能否解决它……
  • 你觉得我应该怎么处理这个问题?我想我可以在每次处理异常之前加上 except EOFError: pass,但如果你有更好的或更简洁的想法,我很想听听。

谢谢!

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

当你在连接上使用readline()方法时,如果返回的是空行,就会引发EOFError,这个空行表示断开连接的事件。

关于你评论的编辑:

服务器并不会发送空行。readline()会返回所有内容,直到下一个\n\r\r\n,具体取决于它的配置。在这种情况下,没有内容可读,因为文件的末尾已经到达。这会导致readline() 返回一个空行,但这并不意味着真的读到了一个空行。如果真的读到了一个空行,readline()会返回结束行的字符(\n\r\n\r)。

如果你在使用FTPUtil时没有遇到这个异常,那是因为它内部已经处理了这个情况。

撰写回答