Значок b
указывает на то, что у вас есть bytes
двоичная последовательность байтов, а не строка символов Юникода. Подпроцессы выводят байты, а не символы, вот что и communicate()
возвращается.
bytes
Тип непосредственно не в print()
состоянии, так что вы время показали repr
из bytes
вас есть. Если вы знаете кодировку байтов, полученных от подпроцесса, вы можете использовать их decode()
для преобразования в печатную форму str
:
>>> print(b'hi\n'.decode('ascii'))
hi
Конечно, этот конкретный пример работает, только если вы действительно получаете ASCII из подпроцесса. Если это не ASCII, вы получите исключение:
>>> print(b'\xff'.decode('ascii'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0…
Новая строка является частью echo hi
вывода. echo
его задача - вывести переданные вами параметры с последующим переводом строки. Если вас не интересуют пробелы вокруг вывода процесса, вы можете использовать strip()
так:
>>> b'hi\n'.strip()
b'hi'