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
4

1 に答える 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
于 2013-10-31T23:26:32.483 に答える