【问题标题】:Getting EOFError along with exceptions when using ftplib使用 ftplib 时出现 EOFError 和异常
【发布时间】:2011-10-12 16:24:32
【问题描述】:

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

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

我在征求意见:

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

谢谢!

【问题讨论】:

    标签: python ftp ftplib eoferror ftputil


    【解决方案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
    

    EOFError 仅在连接上的readline() 返回空行时引发,注释表明这是一个断开连接事件。

    编辑您的评论:

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

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

    【讨论】:

    • 我不认为他们是...我可以登录,获取目录列表,尝试创建一个我无权创建的目录(并获取和 EOFerror 以及error_perm),然后dir()再次成功地在同一个连接对象上。如果它关闭了连接,我不应该不能做后者(或者至少需要重新登录)吗?
    • 我认为可能有两个层次的连接——每个请求和响应本质上是一个连接,而控制通道本质上是另一个连接。这个EOF 发生在每个命令之后(我认为),但只有当命令出错时才会冒泡。
    • 我想是这样,但我仍然不知道为什么服务器会发送一个带有异常的空行...最重要的是,ftputil 只给了我相关的异常,即使它似乎使用ftplib...
    • 感谢您一步一步地解释它:)我仍然认为这有点奇怪,但这可能是这个库和我连接到的服务器之间的一些不幸的协同作用......再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2015-02-05
    相关资源
    最近更新 更多