使用ftplib时出现EOFError和其他异常
我正在研究使用 ftplib(可能还会用到 ftputil)来进行一些自动化的 FTP 文件同步。目前我有几个服务器可以测试,虽然我和这两个服务器的连接都很顺利,但每次遇到错误回复时,我都会收到 EOFError 错误。例如:如果我用错误的用户名或密码登录,我会收到 530 的错误响应,所有信息都会显示出来……但我同时也会收到 EOFError;如果我用正确的用户名和密码登录,或者在登录后尝试 dir() 等操作,就不会出现 EOFError。
这个错误似乎只在出现错误信息时才会出现。我强烈怀疑这可能是服务器的问题,而不是 Python 的问题:我在其他地方没有找到关于这个问题的任何信息。不过,我对服务器的设置几乎没有控制权。
我想请教一下大家的想法:
- 你知道这个错误最初可能是什么原因吗?
- 如果是服务器的问题,你能具体说明一下吗?我在知道是什么问题之前,不知道自己能否解决它……
- 你觉得我应该怎么处理这个问题?我想我可以在每次处理异常之前加上
except EOFError: pass
,但如果你有更好的或更简洁的想法,我很想听听。
谢谢!
1 个回答
服务器发送了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时没有遇到这个异常,那是因为它内部已经处理了这个情况。