2012-06-05 3 views
0

서버에 연결하여 전체 디렉토리의 로컬 복사본을 만드는 스크립트가 있습니다. EOFerror는 선택한 파일 중 정확히 50 개의 파일을 다운로드 한 후에 발생합니다.Python ftplib EOFerror

누구든지 스크립트에 어떤 문제가 있다고 말할 수 있습니까?

ERROR :

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() 

편집 : 파이썬 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의 버전과 최신 버전의 ftplib 모듈에 대한 코드를 말하지 않았습니다 [http : //hg.python.org/cpython/file/2.7/Lib/ftplib.py)이 질문에 스택 추적과 일치하지 않습니다. 어쨌든, 이전 릴리스 인 경우'pwd()'함수가 수정 된 것처럼 보입니다 - 아마도 버그가 발생할 가능성이 있기 때문일 수 있습니다. – martineau

+0

파이썬 2.7.3을 사용하고 있습니다. –

+1

링크 된 소스 코드를 보면,'pwd()'는 끝에있는'return parse257 (resp)'를 실행하고 리턴 된 self.getresp()는하지 않습니다. 스택 추적에서. Py 2.7.3으로 업그레이드했을 때'ftplib.py '가 업데이트되지 않았을 수도 있습니다. 그렇지 않으면 수동으로 시도 할 수 있습니다. – martineau

답변

1

나는 당신의 스크립트를 시도하고 그것은 작동 아무 문제없이. 방금 서버를 사용하여 233 개의 이미지를 가져 왔습니다. 현재 디렉토리를 ftp.cwd("./public_html/eeeeeeee/rrrrrrrr/images")으로 설정하고 무슨 일이 일어나는지보십시오 ...

+0

서버에 "깨진"파일이있을 수 있습니까? –

관련 문제