Werkzeug: No se puede colorear la consola de Windows

Creado en 3 may. 2020  ·  6Comentarios  ·  Fuente: pallets/werkzeug

En Windows, el nuevo Flask imprime caracteres extraños en la consola, en lugar de colorear la línea como en Linux. por ejemplo: "← [37m

Prefiero ir en blanco y negro (como en la versión anterior) si el color no funciona.

2020-05-03 14: 05: 47,398 - INFO - 127.0.0.1 - - [03 / mayo / 2020 14:05:47] "← [37mGET / resultado HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 06: 42,922 - INFO - 127.0.0.1 - - [03 / mayo / 2020 14:06:42] "← [37mGET / resultado HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 07: 24,007 - INFO - 127.0.0.1 - - [03 / May / 2020 14:07:24] "← [37mGET / resultado HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 07: 24,210 - INFO - 127.0.0.1 - - [03 / May / 2020 14:07:24] "← [37mGET /static/images/favicon.ico HTT
2020-05-03 14: 08: 19,539 - INFO - 127.0.0.1 - - [03 / mayo / 2020 14:08:19] "← [37mGET / resultado HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 09: 15,065 - INFO - 127.0.0.1 - - [03 / mayo / 2020 14:09:15] "← [37mGET / resultado HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 10: 10,579 - INFO - 127.0.0.1 - - [03 / mayo / 2020 14:10:10] "← [37mGET / resultado HTTP / 1.1 ← [0m" 200 -

Env:
Matraz == 1.1.2
Win7 x64
Python 3.6.7 x64
Werkzeug == 1.0.1

bug

Comentario más útil

Pude corregir el problema agregando el siguiente código a mi aplicación de matraz

import os
import sys

if sys.platform.lower() == "win32": 
    os.system('color')

Consulte https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python para obtener más detalles.

Parece que los corchetes dobles se están filtrando en los registros como sugirió @ mrx23dot .

Todos 6 comentarios

No pude duplicar.

Vista del símbolo del sistema:
image

Terminal de Pycharm:
image

PyCharm Run:
image

Estoy ejecutando Windows 10 x64, Python 3.7.4, frasco 1.1.2, Werkzeug 1.0.1

No estoy seguro de cómo explicar esto. En todo caso, es un problema con Click, pero no se supone que Click emita información de color en Windows si colorama no está instalado. He visto más informes de esto desde que cambié a Click, pero no es consistente, como se muestra en las capturas de pantalla anteriores.

Probado en Win7 y Win10 mismo problema, aunque veo que la coloración funciona, pero no para las llamadas REST:
2020-05-04_215343

Tengo estos instalados:
haga clic en == 7.1.1
colorama == 0.4.3
registros de colores == 14.0

Todos estos funcionan con la coloración:
de colorama import Fore, Back, Style
imprimir (Fore.RED + 'algo de texto rojo')
print ('033 [31m' + 'texto rojo')

importar clic
click.echo ('033 [31m' + 'texto rojo')

del matraz:
"← [37mGET" <- esto podría escaparse de forma no válida en el código (¿necesita barras diagonales dobles?), Funcionó para mí con single

Pude corregir el problema agregando el siguiente código a mi aplicación de matraz

import os
import sys

if sys.platform.lower() == "win32": 
    os.system('color')

Consulte https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python para obtener más detalles.

Parece que los corchetes dobles se están filtrando en los registros como sugirió @ mrx23dot .

Pasé más tiempo investigando este problema. La adición de color proviene de click.style . Aquí está el código relevante de serving.WSGIRequestHandler :

def log_request(self, code="-", size="-") -> None:
        try:
            path = uri_to_iri(self.path)
            msg = f"{self.command} {path} {self.request_version}"
        except AttributeError:
            # path isn't set if the requestline was bad
            msg = self.requestline

        code = str(code)

        if click:
            color = click.style

            if code[0] == "1":  # 1xx - Informational
                msg = color(msg, bold=True)
            elif code[0] == "2":  # 2xx - Success
                msg = color(msg, fg="white")
            elif code == "304":  # 304 - Resource Not Modified
                msg = color(msg, fg="cyan")
            elif code[0] == "3":  # 3xx - Redirection
                msg = color(msg, fg="green")
            elif code == "404":  # 404 - Resource Not Found
                msg = color(msg, fg="yellow")
            elif code[0] == "4":  # 4xx - Client Error
                msg = color(msg, fg="red", bold=True)
            else:  # 5xx, or any other response
                msg = color(msg, fg="magenta", bold=True)

        self.log("info", '"%s" %s %s', msg, code, size)

Puede ver que la función click.style simplemente envuelve el mensaje inicial en códigos de estilo ANSI. Para Linux y OS X, los códigos ANSI son compatibles de forma predeterminada, por lo que esos usuarios no notarán este problema. Sin embargo, en Windows, el terminal no lo admite de forma predeterminada. Si usa Windows 10, una solución alternativa simple es usar el siguiente comando para habilitar el estilo ANSI:

import sys
import os

if sys.platform.lower() == 'win32':
    os.system('color')

Esto abordará la mayoría de los usuarios con el problema, pero es posible que no solucione algunos casos extremos (por ejemplo, distribuciones unix integradas o de tamaño reducido). La os.system('color') (o en realidad cualquier llamada os.system ) se puede colocar en casi cualquier lugar del código base. Siempre que se llame antes de que se imprima la salida, la salida se mostrará correctamente coloreada. Esta es probablemente la razón por la que los usuarios de PyCharm no notan el error. La terminal PyCharm Python probablemente hace una llamada os.system para manejar la salida de texto en color.

Entonces, de la forma en que lo veo, hay 2 preguntas:

  1. ¿Debería werkzeug solucionar este problema menor o dejar la carga en los usuarios de Windows 10 para que llamen a os.system ?
  2. Si arreglamos esto en werkzeug, ¿dónde deberíamos agregar la llamada os.system ? Solo necesita ser llamado una vez, así que quizás podría agregarse a WSGIRequestHandler.__init__ ? Probablemente haya mejores opciones, pero eso es todo lo que puedo pensar en este momento.

Pude corregir el problema agregando el siguiente código a mi aplicación de matraz

import os
import sys

if sys.platform.lower() == "win32": 
    os.system('color')

Consulte https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python para obtener más detalles.

Parece que los corchetes dobles se están filtrando en los registros como sugirió @ mrx23dot .

Gracias. agregue el código en config.py, funciona para mí. 😀

¿Fue útil esta página
0 / 5 - 0 calificaciones