Удалить экранирующие последовательности ANSI при перенаправлении вывода Python - PullRequest
0 голосов
/ 25 апреля 2019

Я собираю учебный проект, в котором студенты будут переопределять утилиту grep в python.Одна функция, которую я хотел реализовать, - это способность grep выводить соответствующий текст в цвете.Для этого я использовал escape-последовательности ANSI:

# min_example.py
START = '\033[91m'
END = '\033[0m'

some_line = f'this is {START}matching{END} text'
print(some_line)

Это работает точно так, как ожидалось.Однако при передаче вывода в текстовый файл включаются необработанные escape-последовательности:

$ python min_example.py > test.txt
$ vi test.txt
this is ^[[91mmatching^[[0m text

Реальной утилите grep удается вывести цвет на терминал, но ее вывод можно перенести в текстовый файл без каких-либо непонятных символов escape-последовательности.

Итак, мой вопрос: что здесь делает grep по-другому, и как я могу воспроизвести его так, чтобы я мог выводить цвет, но при этом иметь «трубу»"вывод?

1 Ответ

0 голосов
/ 25 апреля 2019

Оказывается, это потому, что grep не разрешает вывод цвета при передаче по трубопроводу.Его опция --color=auto включает цветной вывод, только если стандартный вывод подключен к терминалу.Выполнение того же теста с grep --color=always ... также приводит к тому, что управляющие символы ANSI записываются в текстовый файл.

Я решил эту проблему, протестировав sys.stdout.isatty() перед добавлением управляющих кодов ANSI

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...