Използвам този код, за да получа стандартен изход от външна програма:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
Методът communicate() връща масив от байтове:
>>> 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.
Трябва да декодирате обекта bytes, за да получите низ:
>>> b"abcde"
b'abcde'
# utf-8 is used here because it is a very common encoding, but you
# need to use the encoding your data is actually in.
>>> b"abcde".decode("utf-8")
'abcde'
Трябва да декодирате байтовия низ и да го превърнете в символен низ (Unicode).
В Python 2
encoding = 'utf-8'
'hello'.decode(encoding)
или
unicode('hello', encoding)
За Python 3
encoding = 'utf-8'
b'hello'.decode(encoding)
или
str(b'hello', encoding)
Мисля, че всъщност искате това:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
>>> command_text = command_stdout.decode(encoding='windows-1252')
Отговорът на Аарон е верен, с изключение на това, че трябва да знаете кое кодиране да използвате. А аз смятам, че Windows използва 'windows-1252'. Това ще има значение само ако в съдържанието ви има някои необичайни (неASCII) символи, но тогава ще има значение.
Между другото, фактът, че това има значение, е причината Python да премине към използването на два различни типа за двоични и текстови данни: той не може'да конвертира магически между тях, защото не знае кодирането, ако не му го кажете! Единственият начин, по който ВИЕ бихте могли да знаете, е да прочетете документацията на Windows (или да я прочетете тук).