paramiko-1.16.0 readlines()解码错误

时间:2016-01-01 19:10:38

标签: python decode paramiko 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行,在readlines中     line = self.readline()
  文件" /usr/local/lib/python3.4/site-packages/paramiko/file.py",第270行,在readline中     返回行如果self._flags& self.FLAG_BINARY否则你(行)
  文件" /usr/local/lib/python3.4/site-packages/paramiko/py3compat.py" ;,第148行,在你身上     return s.decode(encoding)
UnicodeDecodeError:' utf-8'编解码器不能解码位置80中的字节0xe2:无效的连续字节

1 个答案:

答案 0 :(得分:2)

好吧,我修改了python 3的paramiko.py3compat“u”方法。(没有修改python 2版本)如果utf8解码失败,请尝试ISO-8859-1。标准尝试:除了:包装器。

怀疑这个问题只发生在Python 3上。本来很高兴覆盖py3compay.pt u()方法而不是修改paramiko库文件,但需要继续解决这个问题。

这是我修补到py3compat.py中的新u()方法:

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)