2012-06-05 125 views
0

我有一個腳本連接到服務器,並使整個目錄的本地副本。 在下載了任意選擇的50個文件後,會發生EOFerror。Python ftplib EOFerror

任何人都可以告訴我,腳本有什麼問題嗎?

錯誤:

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 

SCRIPT:

#!/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' 
+0

你沒有說你正在使用什麼版本的Python,以及最新版本[2.7]中的'ftplib'模塊的代碼(http: //hg.python.org/cpython/file/2.7/Lib/ftplib.py)與您的問題中的堆棧跟蹤不匹配。無論如何,如果它是早期版本,那麼它看起來像'pwd()'函數已被修改 - 可能是因爲你可能會遇到一個錯誤。 – martineau

+0

我正在使用Python 2.7.3 –

+1

那麼,如果您查看鏈接的源代碼,'pwd()'在末尾執行'return parse257(resp)',而不是'return self.getresp()',如圖所示在堆棧跟蹤中。當你升級到Py 2.7.3時,可能你的'ftplib.py'沒有被更新。如果沒有,你可以嘗試手動進行。 – martineau

回答

1

我試圖腳本和它的作品沒有任何問題。我只是從我的服務器上使用它來抽取233個圖像。嘗試設置當前目錄爲ftp.cwd("./public_html/eeeeeeee/rrrrrrrr/images"),看看會發生什麼...

+0

服務器上是否存在導致此問題的「損壞」文件? –