Как определить, поддерживает ли консоль escape-коды ANSI в Python?
Чтобы обнаружить консоль, правильно 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-раскраску. Одно из требований заключается в том, что ни при каких обстоятельствах я не должен выводить что-то, когда выход перенаправляется в файл (для консоли это было бы приемлемо).
Update
Добавлен более сложный тест ANSI script на https://gist.github.com/1316877
Ответы
Ответ 1
Пользователи Django могут использовать функцию django.core.management.color.supports_color
.
if supports_color():
...
Код, который они используют:
def supports_color():
"""
Returns True if the running system 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.
Ответ 2
Я могу рассказать вам, как другие решили эту проблему, но это не очень. Если вы посмотрите на ncurses в качестве примера (который должен быть способен работать на всех типах разных терминалов), вы увидите, что они используют базу данных возможностей , чтобы хранить каждый терминал и его возможности. Суть в том, что даже они никогда не могли автоматически "обнаружить" эти вещи.
Я не знаю, есть ли кроссплатформенный termcap, но, вероятно, стоит потратить ваше время на его поиск. Даже если это там, возможно, у вас нет своего терминала, и вам, возможно, придется вручную его добавить.