Значок 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'