Werkzeug: Falha ao colorir o console do Windows

Criado em 3 mai. 2020  ·  6Comentários  ·  Fonte: pallets/werkzeug

No windows, o novo Flask imprime caracteres estranhos no console, ao invés de colorir a linha como no Linux. por exemplo: "← [37m

Prefiro usar preto / branco (como na versão anterior) se a coloração não funcionar.

2020-05-03 14: 05: 47.398 - INFO - 127.0.0.1 - - [03 / maio / 2020 14:05:47] "← [37mGET / resultado HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 06: 42.922 - INFO - 127.0.0.1 - - [03 / maio / 2020 14:06:42] "← [37mGET / resultado HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 07: 24.007 - INFO - 127.0.0.1 - - [03 / maio / 2020 14:07:24] "← [37mGET / resultado HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 07: 24.210 - INFO - 127.0.0.1 - - [03 / maio / 2020 14:07:24] "← [37mGET /static/images/favicon.ico HTT
2020-05-03 14: 08: 19.539 - INFO - 127.0.0.1 - - [03 / maio / 2020 14:08:19] "← [37mGET / resultado HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 09: 15.065 - INFO - 127.0.0.1 - - [03 / maio / 2020 14:09:15] "← [37mGET / resultado HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 10: 10.579 - INFO - 127.0.0.1 - - [03 / maio / 2020 14:10:10] "← [37mGET / resultado HTTP / 1.1 ← [0m" 200 -

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

bug

Comentários muito úteis

Consegui corrigir o problema adicionando o seguinte código ao meu aplicativo Flask

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 obter detalhes.

Parece que os colchetes duplos estão sendo filtrados nos logs como @ mrx23dot sugeriu.

Todos 6 comentários

Não consegui duplicar.

Visualização do prompt de comando:
image

Terminal Pycharm:
image

PyCharm Run:
image

Estou executando o Windows 10 x64, Python 3.7.4, flask 1.1.2, Werkzeug 1.0.1

Não tenho certeza de como explicar isso. Se houver alguma coisa, é um problema com o Click, mas o Click não deve emitir informações de cores no Windows se o colorama não estiver instalado. Tenho visto mais relatos sobre isso desde a mudança para o Click, mas não é consistente, como mostrado nas capturas de tela anteriores.

Testado no Win7 e Win10 com o mesmo problema, embora eu veja a coloração funcionando, mas não para chamadas REST:
2020-05-04_215343

Eu tenho estes instalados:
click == 7.1.1
colorama == 0.4.3
colouredlogs == 14.0

Todos funcionam com coloração:
do colorama import Fore, Back, Style
imprimir (Fore.RED + 'algum texto vermelho')
imprimir ('033 [31m' + 'algum texto em vermelho')

clique de importação
click.echo ('033 [31m' + 'algum texto vermelho')

do frasco:
"← [37mGET" <- pode ter escape inválido no código (precisa de barras duplas?), Funcionou para mim com simples

Consegui corrigir o problema adicionando o seguinte código ao meu aplicativo Flask

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 obter detalhes.

Parece que os colchetes duplos estão sendo filtrados nos logs como @ mrx23dot sugeriu.

Passei mais algum tempo investigando esse problema. A adição de cor vem de click.style . Aqui está o 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)

Você pode ver que a função click.style está simplesmente envolvendo a mensagem inicial em códigos de estilo ANSI. Para Linux e OS X, os códigos ANSI são suportados por padrão, portanto, esses usuários não perceberão esse problema. No entanto, no Windows, o terminal não suporta isso por padrão. Se estiver usando o Windows 10, uma solução simples é usar o seguinte comando para ativar o estilo ANSI:

import sys
import os

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

Isso resolverá a maioria dos usuários com o problema, mas pode não corrigir alguns casos extremos (por exemplo, pequenas dimensões ou distros Unix incorporadas). O os.system('color') (ou realmente qualquer os.system chamada) pode ser colocado em quase qualquer lugar na base de código. Contanto que seja chamado antes de a saída ser impressa, a saída aparecerá com as cores adequadas. É provavelmente por isso que os usuários do PyCharm não percebem o bug. O terminal PyCharm python provavelmente faz uma chamada os.system para lidar com a saída de texto colorido.

Portanto, a meu ver, existem 2 questões:

  1. O werkzeug deveria corrigir esse pequeno problema ou deixar para os usuários do Windows 10 a tarefa de ligar para os.system ?
  2. Se corrigirmos isso no werkzeug, onde devemos adicionar a chamada os.system ? Ele só precisa ser chamado uma vez, então talvez possa ser adicionado a WSGIRequestHandler.__init__ ? Provavelmente, existem opções melhores, mas é tudo o que posso pensar agora.

Consegui corrigir o problema adicionando o seguinte código ao meu aplicativo Flask

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 obter detalhes.

Parece que os colchetes duplos estão sendo filtrados nos logs como @ mrx23dot sugeriu.

Obrigado. adicione o código em config.py, ele funciona para mim. 😀

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

asottile picture asottile  ·  11Comentários

SimonSapin picture SimonSapin  ·  12Comentários

sorenh picture sorenh  ·  4Comentários

miki725 picture miki725  ·  10Comentários

lepture picture lepture  ·  6Comentários