从TextIOWrapper读取会导致UnicodeDecodeError

时间:2017-05-02 21:24:07

标签: python encoding subprocess stdout popen

我尝试逐行读取子进程:

proc = subprocess.Popen(self.monitor_logcat_cmd, shell=True, stdout=subprocess.PIPE,
                        bufsize=1, universal_newlines=True)

while proc.poll() is None:
    line = proc.stdout.readline()
    print("Process line: " + str(line))

它有效,但在某些时候我得到错误:

Exception in thread Thread-14:
Traceback (most recent call last):
  File "/Users/F1sherKK/anaconda3/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/Users/F1sherKK/Dev/Python/AutomationTestSupervisor/session/SessionThreads.py", line 46, in run
    line = proc.stdout.readline()
  File "/Users/F1sherKK/anaconda3/lib/python3.6/codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 89: invalid start byte

有没有办法为子进程的stdout添加/指定编码?我想添加错误“忽略”。

还有其他方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

可以errors关键字参数设置为Popen()'ignore'。来自documentation

  

如果指定编码错误,或者 universal_newlines 为true,则文件对象 stdin 编码和错误或{{的默认值>以文本模式打开> stdout 和 stderr 1}}。

但是,很明显,您的进程不使用UTF-8对其输出进行编码。您可能想知道a)它是否可以配置为生成不同的编码,或者b)使用了什么编码并将其配置(使用io.TextIOWrapper关键字参数encoding)。