stdout.readlines() returns UnicodeDecodeError
stdout.readlines() returns UnicodeDecodeError
我正在使用 paramiko 连接到一台机器并提取其系统日志。
当我尝试使用函数 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
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'
>>>
更新:
刚刚看了一下 Paramiko 的源代码,它有一个未记录的函数 _set_mode()
,可用于将 stdout 设置为 binary 禁用解码的模式:
>>> stdin, stdout, stderr = ssh.exec_command(r'printf \xc5\n\xc5\n')
>>> stdout._set_mode('b')
>>> v = stdout.readlines()
>>> v
['\xc5\n', '\xc5\n']
>>>
我正在使用 paramiko 连接到一台机器并提取其系统日志。 当我尝试使用函数 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
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'
>>>
更新:
刚刚看了一下 Paramiko 的源代码,它有一个未记录的函数 _set_mode()
,可用于将 stdout 设置为 binary 禁用解码的模式:
>>> stdin, stdout, stderr = ssh.exec_command(r'printf \xc5\n\xc5\n')
>>> stdout._set_mode('b')
>>> v = stdout.readlines()
>>> v
['\xc5\n', '\xc5\n']
>>>