usar secuencias graficas fondo escape como colores color codigo codes python console stdout ansi-escape windows-controls

secuencias - como usar colorama en python



¿Cómo detectar si la consola admite códigos de escape ANSI en Python? (2)

Los usuarios de Django pueden usar la función django.core.management.color.supports_color .

if supports_color(): ...

El código que utilizan es:

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() if not supported_platform or not is_a_tty: return False return True

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

Para detectar si la consola, sys.stderr o sys.stdout correctamente, estaba haciendo la siguiente prueba:

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

Ahora el problema se hizo más complejo al ejecutar este código Python a través de un IDE (como PyCharm). Recientemente, PyCharm agregó soporte para ANSI, pero la primera prueba falla: tiene el atributo isatty pero está establecido en False .

Quiero modificar la lógica para que detecte correctamente si la salida admite la coloración ANSI. Un requisito es que bajo ninguna circunstancia debería emitir algo cuando la salida se redirige a un archivo (para la consola sería aceptable).

Actualizar

Se agregó un script de prueba ANSI más complejo en https://gist.github.com/1316877


Puedo decirles cómo otros han resuelto este problema, pero no es bonito. Si observa ncurses como un ejemplo (que debe poder ejecutarse en todo tipo de terminales diferentes), verá que utilizan una base de datos de capacidades de terminal para almacenar cada tipo de terminal y sus capacidades. El punto es que, incluso ellos nunca fueron capaces de "detectar" automáticamente estas cosas.

No sé si hay un termcap multiplataforma, pero probablemente valga la pena su tiempo para buscarlo. Sin embargo, incluso si está disponible, es posible que no tenga su terminal en la lista y es posible que tenga que agregarlo manualmente.