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'
你沒有說你正在使用什麼版本的Python,以及最新版本[2.7]中的'ftplib'模塊的代碼(http: //hg.python.org/cpython/file/2.7/Lib/ftplib.py)與您的問題中的堆棧跟蹤不匹配。無論如何,如果它是早期版本,那麼它看起來像'pwd()'函數已被修改 - 可能是因爲你可能會遇到一個錯誤。 – martineau
我正在使用Python 2.7.3 –
那麼,如果您查看鏈接的源代碼,'pwd()'在末尾執行'return parse257(resp)',而不是'return self.getresp()',如圖所示在堆棧跟蹤中。當你升級到Py 2.7.3時,可能你的'ftplib.py'沒有被更新。如果沒有,你可以嘗試手動進行。 – martineau