Я использую этот код для получения стандартного вывода из внешней программы:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
Метод communication () возвращает массив байтов:
>>> command_stdout
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file2\n'
Тем не менее, я хотел бы работать с выводом в виде обычной строки Python. Чтобы я мог напечатать это так:
>>> print(command_stdout)
-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file1
-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file2
Я думал, что для этого предназначен метод binascii.b2a_qp () , но когда я попробовал его, я снова получил тот же байтовый массив:
>>> binascii.b2a_qp(command_stdout)
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file2\n'
Как преобразовать значение байтов обратно в строку? Я имею в виду, используя «батареи» вместо того, чтобы делать это вручную. И я бы хотел, чтобы с Python 3 все было в порядке.
str(text_bytes)
не могу указать кодировку. В зависимости от того, что в text_bytes, text_bytes.decode('cp1250
) `может привести к совсем другой строке text_bytes.decode('utf-8')
.
str
функция больше не преобразуется в реальную строку. Нужно сказать кодировку явно, по какой-то причине мне лень читать, почему. Просто преобразуйте его utf-8
и посмотрите, работает ли ваш код. Напримерvar = var.decode('utf-8')
unicode_text = str(bytestring, character_encoding)
работает должным образом на Python 3. Хотя unicode_text = bytestring.decode(character_encoding)
предпочтительнее избегать путаницы с тем, str(bytes_obj)
что bytes_obj
вместо текстового представления создается текстовое представление, str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'
аstr(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
str(text_bytes)
работает? Это кажется странным для меня.