paramiko-1.16.0 ошибка декодирования readlines ()

Выполнение довольно стандартной реализации paramiko возвращает ошибку декодирования в readlines () для текста странно сформированного из удаленной команды. Не могу изменить вывод команды. Как мне написать код для правильного декодирования. См. Текст ошибки декодирования внизу:

фрагмент кода используется:

connect = paramiko.SSHClient()
connect.connect(self.name,
                username = self.ruser,
                password = password,
                key_filename = idkey,
                timeout = 15,
               )
stdin, stdout, stderr = connect.exec_command(cmd)
retval=stdout.channel.recv_exit_status()
stdin.flush()
stdout.flush()
stderr.flush()
out = stdout.readlines()
sys.exit()

ТЕКСТ ОШИБКИ:

Файл "../pylib/hosts/host.py", строка 128, в cmd
out = stdout.readlines ()
Файл "/usr/local/lib/python3.4/site-packages/paramiko /file.py ", строка 285, в строках чтения
line = self.readline ()
Файл" /usr/local/lib/python3.4/site-packages/paramiko/file.py ", строка 270 , в строке чтения
строка возврата, если self._flags & self.FLAG_BINARY else u (строка)
Файл "/usr/local/lib/python3.4/site-packages/paramiko/py3compat.py", строка 148 ,
in u return s.decode (кодировка)
UnicodeDecodeError: кодек 'utf-8' не может декодировать байт 0xe2 в позиции 80: недопустимый байт продолжения


person Fragtzack    schedule 01.01.2016    source источник


Ответы (1)


Что ж, я изменил метод paramiko.py3compat "u" для python 3. (не изменял версию python 2) Если декодирование utf8 не удается, попробуйте ISO-8859-1. Стандартная попытка: except: wrapper.

Подозреваю, что эта проблема возникает только с Python 3. Было бы неплохо переопределить метод py3compay.pt u () вместо изменения файла библиотеки paramiko, но от этой проблемы нужно было отказаться.

Вот новый метод u (), который я пропатчил в py3compat.py:

def u(s, encoding='utf8'):
    """cast bytes or unicode to unicode"""
    if isinstance(s, bytes):
        try:
            return s.decode(encoding)
        except UnicodeDecodeError:
            return s.decode('ISO-8859-1')
    elif isinstance(s, str):
        return s
    else:
        raise TypeError("Expected unicode or bytes, got %r" % s)
person Fragtzack    schedule 01.01.2016