Как определить, поддерживает ли консоль экранирующие коды ANSI в Python? - PullRequest
31 голосов
/ 16 сентября 2011

Чтобы определить, правильно ли установлена ​​консоль sys.stderr или sys.stdout, я проводил следующий тест:

if hasattr(sys.stderr, "isatty") and sys.stderr.isatty():
   if platform.system()=='Windows':
       # win code (ANSI not supported but there are alternatives)
   else:
       # use ANSI escapes
else:
   # no colors, usually this is when you redirect the output to a file

Теперь проблема стала более сложной при запуске этого кода Python через IDE (например, PyCharm). Недавно PyCharm добавил поддержку ANSI, но первый тест не пройден: у него есть атрибут isatty, но он установлен на False.

Я хочу изменить логику, чтобы она правильно определяла, поддерживает ли вывод раскраску ANSI. Одно из требований заключается в том, что ни при каких обстоятельствах я не должен выводить что-либо, когда вывод перенаправляется в файл (для консоли это будет приемлемо).

Обновление

Добавлен более сложный тестовый скрипт ANSI на https://gist.github.com/1316877

Ответы [ 2 ]

18 голосов
/ 07 марта 2014

Пользователи Django могут использовать функцию django.core.management.color.supports_color.

if supports_color():
    ...

Код, который они используют:

def supports_color():
    """
    Returns True if the running system's terminal supports color, and False
    otherwise.
    """
    plat = sys.platform
    supported_platform = plat != 'Pocket PC' and (plat != 'win32' or
                                                  'ANSICON' in os.environ)
    # isatty is not always implemented, #6223.
    is_a_tty = hasattr(sys.stdout, 'isatty') and sys.stdout.isatty()
    return supported_platform and is_a_tty

См. https://github.com/django/django/blob/master/django/core/management/color.py

9 голосов
/ 16 сентября 2011

Я могу рассказать вам, как другие решили эту проблему, но это не красиво. Если вы посмотрите на ncurses в качестве примера (который должен работать на всех типах терминалов), вы увидите, что они используют базу данных возможностей терминала для хранения каждого типа терминала и его возможностей , Дело в том, что даже они никогда не смогли автоматически «обнаружить» эти вещи.

Я не знаю, есть ли кроссплатформенный termcap, но, вероятно, стоит потратить время на его поиск. Даже если он там есть, возможно, ваш терминал отсутствует в списке, и вам, возможно, придется добавить его вручную.

...