Я використовую цей код, щоб отримати стандартний вихід із зовнішньої програми:
>>> 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)
працює? Мені це здається химерним.