stdout.readlines()返回UnicodeDecodeError

时间:2017-07-11 07:57:31

标签: python-2.7 unicode utf-8 paramiko syslog

我使用paramiko连接到机器并提取其syslog。 当我尝试使用函数readlines()时,我收到了UnicodeDecodeError。

这是该计划:

print_all_lines="awk 'FNR>=%s && FNR <=%s' /var/log/syslog" %(line_number_start, line_number_end)
stdin, stdout, stderr = SSH.exec_command(print_all_lines)
stdout.readlines()

这是错误:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xc5 in position 199: invalid continuation byte

1 个答案:

答案 0 :(得分:0)

readline()readlines()会尝试将数据解码为UTF-8,因此如果数据实际上不在UTF-8中,则可能会失败。您可以使用不会进行解码的read()

stdin, stdout, stderr = SSH.exec_command(print_all_lines)
s = stdout.read()

参见以下示例(在交互式python中):

>>> stdin, stdout, stderr = ssh.exec_command(r'printf \\xc5\\n')
>>> v = stdout.readlines()
Traceback (most recent call last):
  [...snip...]
  File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc5 in position 0:
invalid continuation byte
>>>
>>> stdin, stdout, stderr = ssh.exec_command(r'printf \\xc5\\n')
>>> v = stdout.read()
>>> v
'\xc5\n'
>>>

更新

刚看了一下源代码,它有一个未记录的函数_set_mode(),可用于将 stdout 设置为二进制模式,禁用解码:

>>> stdin, stdout, stderr = ssh.exec_command(r'printf \\xc5\\n\\xc5\\n')
>>> stdout._set_mode('b')
>>> v = stdout.readlines()
>>> v
['\xc5\n', '\xc5\n']
>>>