Как преобразовать кодировку строки, возвращаемой subprocess.Popen ()? - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь выполнить команду с помощью subprocess.Popen () и извлечь результат с помощью следующего кода.

proc = subprocess.Popen([command], stdout=subprocess.PIPE, shell=True)
(out, err) = proc.communicate()
gadgets = out.split('\n')

Результат представляет собой строку и может быть разбит на несколько строк путем разделения на основе символов новой строки в результате.Для простоты предположим, что переменная gadgets в фрагменте кода представляет собой список из двух строк.Когда я печатаю отдельный элемент из списка на консоли с помощью функции python print (), я получаю обычный текст ascii следующим образом.

for item in gadgets:
    print(item)

output:

syscall; 
xlatb; ret;

Однако, когда я печатаю список, я получаю символы другого типа.Вывод выглядит следующим образом:

print(gadgets)

вывод:

['\x1b[1;33msyscall\x1b[0m\x1b[1;34m; \x1b[0m', '\x1b[1;33mxlatb\x1b[0m\x1b[1;34m; \x1b[0m\x1b[1;33mret\x1b[0m\x1b[1;34m; \x1b[0m']

Я считаю, что функция print () каким-то образом изменяет кодировку и печатает обычный текст ascii на консоли для отдельных элементов.,Может кто-нибудь сказать, пожалуйста, какая кодировка используется функцией print () в этом сценарии?Спасибо!

1 Ответ

0 голосов
/ 29 декабря 2018

Второй вывод имеет экранирующие символы ANSI для цветов.Удаление управляющих символов ANSI из второго вывода даст первый вывод.

В этой ссылке [https://stackoverflow.com/a/14693789/3114833] описан способ удаления управляющих символов ANSI.Следующий код скопирован из ссылки.

import re

ansi_escape = re.compile(r'\x1B\[[0-?]*[ -/]*[@-~]')
ansi_escape.sub('', sometext)
...