使用ftplib时获取EOFError以及异常

bde*_*ker 2 python ftp ftplib eoferror ftputil

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

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

我在征求意见:

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

谢谢!

agf*_*agf 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
Run Code Online (Sandbox Code Playgroud)

仅当readline()连接返回空行时才会引发EOFError ,注释指示该空行是断开连接事件.

编辑您的评论:

服务器不发送空行.readline()一切都返回到下一个\n\r还是\r\n取决于它的配置或全部abouve的.在这种情况下,没有什么可读的,因为已经到达文件的末尾.这将导致readline()返回一个空行,这并不意味着一个空行已被读取.如果已读取空行,则readline()返回结束行(\n\r\n\r)的字符.

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