【问题标题】:Python ftplib EOFerrorPython ftplib EOFerror
【发布时间】:2012-06-05 16:30:13
【问题描述】:

我有一个脚本可以连接到服务器并制作整个目录的本地副本。 EOFerror 发生在恰好下载了 50 个任意选择的文件之后。

谁能告诉我,脚本有什么问题?

错误:

Traceback (most recent call last):
  File "ftp.py", line 37, in <module>
    ftp_walk(ftp)
  File "ftp.py", line 17, in ftp_walk
    currdir = ftp.pwd()[1:]
  File "/usr/lib/python2.7/ftplib.py", line 574, in pwd
    resp = self.sendcmd('PWD')
  File "/usr/lib/python2.7/ftplib.py", line 244, in sendcmd
    return self.getresp()
  File "/usr/lib/python2.7/ftplib.py", line 210, in getresp
    resp = self.getmultiline()
  File "/usr/lib/python2.7/ftplib.py", line 196, in getmultiline
    line = self.getline()
  File "/usr/lib/python2.7/ftplib.py", line 186, in getline
    if not line: raise EOFError
EOFError

脚本:

#!/usr/bin/python

import ftplib
import sys
import os
import datetime

def ftp_walk(ftp):    
    dirs = ftp.nlst()
    for item in (path for path in dirs if path not in ('.', '..')):
        try:
            ftp.cwd(item)
            print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")+' DIR: ', ftp.pwd()
            ftp_walk(ftp)
            ftp.cwd('..')
        except Exception, e:
            currdir = ftp.pwd()[1:]
            if not os.path.exists(currdir): os.makedirs(currdir)
            try:
                with open(currdir+"/"+item, 'wb') as f:

                    def callback(data):
                        f.write(data)

                    ftp.retrbinary('RETR %s' % item, callback)
                    f.close()
                    print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")+' RETR: '+ currdir+"/"+item
            except Exception, e:
                print e


ftp = ftplib.FTP("hhhhhhhhhhhhhh")
ftp.login("aaaaaaaa", "bbbbbbbbbbb")
ftp.sendcmd("TYPE I") #binary mode
ftp.set_pasv(True) # Trying Passive mode
ftp.cwd("public_html/eeeeeeee/rrrrrrrr/images")
ftp_walk(ftp)
ftp.quit()

编辑: 为 python 2.7 手动更新 ftplib 后:

Traceback (most recent call last):
  File "ftp.py", line 29, in <module>
    ftp = ftplib.FTP("something.com")
  File "/usr/lib/python2.7/ftplib.py", line 114, in __init__
    self.connect(host)
  File "/usr/lib/python2.7/ftplib.py", line 150, in connect
    self.file = self.sock.makefile('r', encoding=self.encoding)
TypeError: makefile() got an unexpected keyword argument 'encoding'

【问题讨论】:

  • 您没有说明您使用的是哪个版本的 Python,并且最新版本 2.7 中的 ftplib 模块的代码与您问题中的堆栈跟踪不匹配。无论如何,如果它是较早的版本,那么看起来 pwd() 函数已被修改 - 可能是因为您可能遇到了一个错误。
  • 好吧,如果您查看链接的源代码,pwd() 在末尾执行return parse257(resp),而不是堆栈跟踪中显示的return self.getresp()。当您升级到 Py 2.7.3 时,您的 ftplib.py 可能没有更新。如果没有,您可以尝试手动操作。
  • @martineau 我在手动更新 ftplib.py 后添加了错误。仍然无法弄清楚,出了什么问题:/
  • 抱歉,我的第一条评论中给出的链接(来自 Python 文档)中的代码仍然不匹配。该代码在 connect() 方法的第 134 行有 self.file = self.sock.makefile('rb')
  • @martineau 我正在使用最新的hg.python.org/cpython/raw-file/477508efe4ab/Lib/ftplib.py。它在第 134 行有 self.file = self.sock.makefile('rb') 。但它仍然给了我与开始时相同的错误(这篇文章中的第一个错误)。

标签: python ftp eol ftplib


【解决方案1】:

我已经尝试过您的脚本,它可以正常工作。我刚刚使用它从我的服务器中提取了 233 张图像。尝试将当前目录设置为ftp.cwd("./public_html/eeeeeeee/rrrrrrrr/images"),看看会发生什么...

【讨论】:

  • 您的服务器上是否存在导致此问题的“损坏”文件?
猜你喜欢
  • 1970-01-01
  • 2011-10-12
  • 2021-10-22
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2015-10-15
  • 2012-01-31
相关资源
最近更新 更多