Werkzeug: Ne parvient pas à colorer la console Windows

Créé le 3 mai 2020  ·  6Commentaires  ·  Source: pallets/werkzeug

Sous Windows, le nouveau Flask imprime des caractères étranges sur la console, au lieu de colorer la ligne comme sur Linux. par exemple: "← [37m

Je préférerais passer en noir / blanc (comme dans la version précédente) si la coloration ne fonctionne pas.

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

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

bug

Commentaire le plus utile

J'ai pu corriger le problème en ajoutant le code suivant à mon application flask

import os
import sys

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

Voir https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python pour plus de détails.

Il semble que les doubles crochets soient filtrés dans les journaux comme le suggère @ mrx23dot .

Tous les 6 commentaires

Je n'ai pas pu dupliquer.

Vue d'invite de commandes:
image

Terminal Pycharm:
image

PyCharm Run:
image

J'utilise Windows 10 x64, Python 3.7.4, flask 1.1.2, Werkzeug 1.0.1

Je ne sais pas vraiment comment expliquer cela. Si quelque chose est un problème avec Click, mais Click n'est pas censé émettre des informations de couleur sur Windows si colorama n'est pas installé. J'ai vu plus de rapports à ce sujet depuis le passage à Click, mais ce n'est pas cohérent, comme le montrent les captures d'écran précédentes.

Testé sur Win7 et Win10, même problème, bien que je vois la coloration fonctionner, mais pas pour les appels REST:
2020-05-04_215343

J'ai installé ces derniers:
cliquez == 7.1.1
colorama == 0.4.3
bûches colorées == 14,0

Ceux-ci fonctionnent tous avec la coloration:
à partir de l'importation de colorama Fore, Back, Style
print (Fore.RED + 'un texte rouge')
print ('033 [31m' + 'du texte rouge')

import clic
click.echo ('033 [31m' + 'du texte rouge')

de Flask:
"← [37mGET" <- cela pourrait être échappé de manière incorrecte dans le code (nécessite des doubles barres obliques inverses?), Cela a fonctionné pour moi avec un simple

J'ai pu corriger le problème en ajoutant le code suivant à mon application flask

import os
import sys

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

Voir https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python pour plus de détails.

Il semble que les doubles crochets soient filtrés dans les journaux comme le suggère @ mrx23dot .

J'ai passé un peu plus de temps à enquêter sur ce problème. L'ajout de couleur provient de click.style . Voici le code pertinent 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)

Vous pouvez voir que la fonction click.style enveloppe simplement le message initial dans des codes de style ANSI. Pour Linux et OS X, les codes ANSI sont pris en charge par défaut, de sorte que ces utilisateurs ne remarqueront pas ce problème. Cependant, sous Windows, le terminal ne prend pas en charge cela par défaut. Si vous utilisez Windows 10, une solution simple consiste à utiliser la commande suivante pour activer le style ANSI:

import sys
import os

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

Cela répondra à la plupart des utilisateurs avec le problème, mais pourrait ne pas résoudre certains cas extrêmes (par exemple, les distributions Unix à faible encombrement ou intégrées). Le os.system('color') (ou vraiment n'importe quel appel os.system ) peut être placé presque n'importe où dans la base de code. Tant qu'elle est appelée avant l'impression de la sortie, la sortie apparaîtra correctement colorée. C'est probablement pourquoi les utilisateurs de PyCharm ne remarquent pas le bogue. Le terminal python PyCharm effectue probablement un appel os.system pour gérer la sortie de texte coloré.

Donc, d'après moi, il y a 2 questions:

  1. Werkzeug devrait-il résoudre ce problème mineur ou laisser aux utilisateurs de Windows 10 le fardeau d'appeler os.system ?
  2. Si nous corrigeons cela dans werkzeug, où devrions-nous ajouter l'appel os.system ? Il ne doit être appelé qu'une seule fois, alors peut-être pourrait-il être ajouté à WSGIRequestHandler.__init__ ? Il existe probablement de meilleures options, mais c'est tout ce à quoi je peux penser pour le moment.

J'ai pu corriger le problème en ajoutant le code suivant à mon application flask

import os
import sys

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

Voir https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python pour plus de détails.

Il semble que les doubles crochets soient filtrés dans les journaux comme le suggère @ mrx23dot .

Merci. ajoutez le code dans config.py, ça marche pour moi. 😀

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

taion picture taion  ·  7Commentaires

KangOl picture KangOl  ·  16Commentaires

ngaya-ll picture ngaya-ll  ·  8Commentaires

SimonSapin picture SimonSapin  ·  12Commentaires

miki725 picture miki725  ·  10Commentaires