我有以下删除了凭据初始化的代码。目录列表的打印工作,但是"get"失败,出现以下异常
在我看来,这似乎是在预取失败,因为我提取了getfo中的代码,并在预取被注释掉的情况下将其作为代码中的一个函数来工作。
有更好的解决方案吗?
*** Caught exception: <type 'exceptions.IOError'>: [Errno 2] The message [/Inbox/CD.BAIINT.D130802.T200541.M856559] is not extractable!
Traceback (most recent call last):
File "C:ProjectsPythonSFTPSFTPHSC.py", line 71, in <module>
sftp.get(files, localpath + "/" + files)
File "buildbdist.win-amd64eggparamikosftp_client.py", line 676, in get
size = self.getfo(remotepath, fl, callback)
File "buildbdist.win-amd64eggparamikosftp_client.py", line 640, in getfo
file_size = self.stat(remotepath).st_size
File "buildbdist.win-amd64eggparamikosftp_client.py", line 337, in stat
t, msg = self._request(CMD_STAT, path)
File "buildbdist.win-amd64eggparamikosftp_client.py", line 689, in _request
return self._read_response(num)
File "buildbdist.win-amd64eggparamikosftp_client.py", line 736, in _read_response
self._convert_status(msg)
File "buildbdist.win-amd64eggparamikosftp_client.py", line 762, in _convert_status
raise IOError(errno.ENOENT, text)
IOError: [Errno 2] The message [/Inbox/CD.BAIINT.D130802.T200541.M856559] is not extractable!
username = ''
password=''
hostname =''
port=22
localpath ="c:/BkFiles/"
t = paramiko.Transport((hostname, port))
try:
t.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(t)
dirlist = sftp.listdir('.')
print "Dirlist:", dirlist
sftp.chdir('Inbox')
dirlist = sftp.listdir('.')
print "Dirlist:", dirlist
for files in dirlist:
sftp.get(files, localpath + files)
print files
except Exception, e:
print '*** Caught exception: %s: %s' % (e.__class__, e)
traceback.print_exc()
finally:
try:
t.close()
except:
pass
您得到的特定错误可以在回溯中找到。查看Paramiko的sftp_client.py:760:的源代码
elif code == SFTP_NO_SUCH_FILE:
raise IOError(errno.ENOENT, text)
1) 显然,您试图sftp获取一个根本不存在的文件,或者将其保存到本地计算机上不存在的路径。尝试修改你的代码,打印出你正在下载的路径和保存到的位置:
for files in dirlist:
print ' -> Attempting to download: "{}", and saving it {}'.format(files, localpath + files)
sftp.get(files, localpath + files)
print files
2) 可以将sftp.listdir('.')
缩短为sftp.listdir()
,因为路径的默认参数已经是'.'
。
3) 您甚至可能想要打印出目标文件的统计数据以进行进一步的调试:
for files in dirlist:
print ' -> Attempting to download: "{}", and saving it {}'.format(files, localpath + files)
print ' --> remotepath stat: {}'.format(sftp.stat(files))
sftp.get(files, localpath + files)
print files