paramiko sftp получить ошибку

У меня есть следующий код с удаленной инициализацией учетных данных. Распечатка списка каталогов работает, однако "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

person erase.ego    schedule 03.08.2013    source источник
comment
Вы проверили, не ошибка ли это учетных данных? Какую операционную систему ты используешь? Созданы ли файлы, которые вы пытаетесь извлечь, программой, использующей другой UID из этого скрипта?   -  person AlexLordThorsen    schedule 03.08.2013
comment
Полномочия верны. Как я сказал в своем сообщении, я могу распечатать файлы в каталоге. Кроме того, мне удалось обойти эту проблему, скопировав код для функции getfo из sftp_client.py и вызвав его сразу после комментирования вызова предварительной выборки.   -  person erase.ego    schedule 04.08.2013


Ответы (1)


Конкретную ошибку, которую вы получаете, можно найти в вашей трассировке. Глядя на исходный код 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
person VooDooNOFX    schedule 31.10.2013
comment
+1 Для указания того, что проблема с загрузкой также может быть связана с тем, что локальный путь (папка), по которой вы хотите загрузить файл TO, не существует. - person Guy Avraham; 29.09.2020