import subprocess
result = subprocess.run(['pkexec', 'apt', 'update'], stdout=subprocess.PIPE)
print(result.stdout)
print(result.stdout)
вернул очень длинную строку. Смотри ниже.
pprint.pprint(result.stdout)
вернул тот же контент, что и блок предложений. Смотри ниже.
Я хотел бы, чтобы распечатка result.stdout
была похожа на распечатку терминала при выполнении sudo apt update
. Как я могу добиться этого с помощью python 3.6, найденного в Ubuntu 18.04?
@JohanL Спасибо. Это сработало. Можете ли вы представить это как ответ, чтобы я мог принять его. :)
Причина, по которой вы получаете блок «текста», заключается в том, что вывод является не фактическим string
(который закодирован в utf-8 в Python 3), а объектом bytes
. Это видно из b
, написанного перед текстом. Чтобы превратить объект bytes
в объект string
, его нужно «декодировать».
Для декодирования объекта bytes
используется метод text.decode()
для конкретной строки в этом вопросе, которая превращается в
print(result.stdout.decode())
Объект bytes
может иметь любую кодировку, поэтому вызов .decode()
принимает параметр, указывающий, какую кодировку предполагается декодировать. Наиболее распространенным является utf-8, поэтому, если параметр не указан, предполагается, что это так. Однако, особенно в системах Windows, существуют и другие кодировки (например, «latin1»). Чтобы декодировать объект «latin1» bytes
, вызов будет выглядеть так:
print(text.decode("latin1"))
Также доступна обратная операция, которая кодирует string
в bytes
объект. Логично, что он называется .encode()
и обычно используется в протоколах, которые передают данные в другое место назначения (например, через Интернет или на диск). Также этот вызов принимает аргумент кода, который позволяет кодировать текст, например, как «latin1», хотя по умолчанию используется «utf-8».
Что вы получаете от
print(result.stdout.decode())
? Это то, что вы ожидаете, или это все еще много текста?