逐个读取子进程输出多字节字符

时间:2013-09-10 19:27:42

标签: python python-3.x byte subprocess decode

我正在使用子流程运行流程:

    p = subprocess.Popen(cmd, stdout=subprocess.PIPE)

我想要做的是在循环中逐个读取输出字符:

while something:
    char = p.stdout.read(1)

在python3中subprocess.Popen().stdout.read()返回bytes()而不是str()。我想将它用作str,所以我必须这样做:

    char = char.decode("utf-8")

并且它与ascii字符一起使用。

但是对于非ascii字符(例如希腊字母),我得到了一个UnicodeDecodeError。这就是希腊字符由多个字节组成的原因。这是问题所在:

>>> b'\xce\xb5'.decode('utf-8')
'ε'
>>> b'\xce'.decode('utf-8') # b'\xce' is what subprocess...read(1) returns - one byte
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 0: unexpected end of data
>>> 

我该如何处理? subprocess.Popen().stdout.read()(作为字符串)的输出可以是“loremipsumεφδφδσloremipsum”。

我想一次读一个字符,但这个字符可以由多个字节组成。

1 个答案:

答案 0 :(得分:4)

将文件对象包裹在io.TextIOWrapper()中以便动态解码管道:

import io

reader = io.TextIOWrapper(p.stdout, encoding='utf8')
while something:
    char = reader.read(1)