2013-09-10 3 views
1

Я бег процесса, используя подпроцесс:чтение подпроцесса выходных символов многобайтовых один на один

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.

Но с символами non-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() (как строка) может быть чем-то вроде «lorem ipsum εφδφδσloremipsum».

Я хочу прочитать один символ времени, но этот символ может состоять из нескольких байтов.

ответ

3

Wrap объект файла в io.TextIOWrapper() для декодирования трубы на лету:

import io 

reader = io.TextIOWrapper(p.stdout, encoding='utf8') 
while something: 
    char = reader.read(1) 
Смежные вопросы