2013-08-03 3 views
5

У меня есть следующий код с инициализацией учетных данных. Распечатка работ по листингу каталогов, однако «получить» не удалась со следующим исключениемparamiko sftp получить ошибку

Мне кажется, что это ошибка при предварительной выборке, так как я извлек код в 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 
+0

Вы проверили, чтобы увидеть, если это ошибка учетных данных? Какую операционную систему ты используешь? Файлы, которые вы пытаетесь извлечь, сгенерированные программой с использованием другого UID из этого скрипта? – AlexLordThorsen

+0

Учетные данные верны. Как я уже сказал в своем сообщении, я могу распечатать файлы в каталоге. Кроме того, я смог взломать эту проблему, скопировав код для функции getfo из sftp_client.py и вызвав ее непосредственно после комментирования вызова для предварительной выборки. –

ответ

1

Специфическая ошибка вы получаете могут быть найдены в вашем TRACEBACK. Глядя на исходный код для sftp_client.py:760 Paramiko в:

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 
Смежные вопросы