Paramiko SFTP获取错误

5

下面的代码已经删除了凭据的初始化。列出目录清单可以正常工作,但是 "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:\Projects\Python\SFTP\SFTPHSC.py", line 71, in <module>
    sftp.get(files, localpath + "/" + files)
  File "build\bdist.win-amd64\egg\paramiko\sftp_client.py", line 676, in get
    size = self.getfo(remotepath, fl, callback)
  File "build\bdist.win-amd64\egg\paramiko\sftp_client.py", line 640, in getfo
    file_size = self.stat(remotepath).st_size
  File "build\bdist.win-amd64\egg\paramiko\sftp_client.py", line 337, in stat
    t, msg = self._request(CMD_STAT, path)
  File "build\bdist.win-amd64\egg\paramiko\sftp_client.py", line 689, in _request
    return self._read_response(num)
  File "build\bdist.win-amd64\egg\paramiko\sftp_client.py", line 736, in _read_response
    self._convert_status(msg)
  File "build\bdist.win-amd64\egg\paramiko\sftp_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

你检查过这是否是凭据错误了吗?你使用的操作系统是什么?你尝试提取的文件是否由使用不同 UID 的程序生成? - AlexLordThorsen
凭据是正确的。正如我在帖子中所说,我能够打印目录中的文件。此外,我通过从sftp_client.py中复制getfo函数的代码并在注释掉调用prefetch后直接调用它来解决了这个问题。 - erase.ego
1个回答

3
你遇到的具体错误可以在回溯中找到。查看Paramiko的源代码sftp_client.py:760
elif code == SFTP_NO_SUCH_FILE:
    raise IOError(errno.ENOENT, text)

1) 显然,你正在尝试sftp GET一个不存在的文件或将其保存到本地机器上不存在的路径。尝试修改您的代码以打印出您正在下载的路径以及保存它的位置:

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

+1 表示“下载”问题可能也是因为您希望将文件下载到的本地路径(文件夹)不存在。 - Guy Avraham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接