Werkzeug: Windows-Konsole kann nicht eingefärbt werden

Erstellt am 3. Mai 2020  ·  6Kommentare  ·  Quelle: pallets/werkzeug

Unter Windows druckt die neue Flasche seltsame Zeichen auf der Konsole, anstatt die Linie wie unter Linux zu färben. zB: "← [37m

Ich würde lieber schwarz / weiß (wie in der vorherigen Version) gehen, wenn das Färben nicht funktioniert.

2020-05-03 14: 05: 47,398 - INFO - 127.0.0.1 - - [03 / Mai / 2020 14:05:47] "← [37mGET / Ergebnis HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 06: 42,922 - INFO - 127.0.0.1 - - [03 / Mai / 2020 14:06:42] "← [37mGET / Ergebnis HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 07: 24,007 - INFO - 127.0.0.1 - - [03 / Mai / 2020 14:07:24] "← [37mGET / Ergebnis 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 / Ergebnis HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 09: 15,065 - INFO - 127.0.0.1 - - [03 / Mai / 2020 14:09:15] "← [37mGET / Ergebnis HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 10: 10,579 - INFO - 127.0.0.1 - - [03 / Mai / 2020 14:10:10] "← [37mGET / Ergebnis HTTP / 1.1 ← [0m" 200 -

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

bug

Hilfreichster Kommentar

Ich konnte das Problem beheben, indem ich meiner Kolben-App den folgenden Code hinzufügte

import os
import sys

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

Weitere Informationen finden Sie unter https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python .

Es scheint, dass die doppelten Klammern in den Protokollen gefiltert werden, wie von @ mrx23dot vorgeschlagen.

Alle 6 Kommentare

Ich konnte nicht duplizieren.

Eingabeaufforderungsansicht:
image

Pycharm Terminal:
image

PyCharm Run:
image

Ich verwende Windows 10 x64, Python 3.7.4, Flasche 1.1.2, Werkzeug 1.0.1

Ich bin mir nicht sicher, wie ich das erklären soll. Wenn überhaupt, liegt ein Problem mit Click vor, aber Click soll unter Windows keine Farbinformationen ausgeben, wenn colorama nicht installiert ist. Ich habe seit dem Wechsel zu Click mehr Berichte darüber gesehen, aber es ist nicht konsistent, wie in den vorherigen Screenshots gezeigt.

Getestet auf Win7 und Win10 das gleiche Problem, obwohl ich sehe, dass das Färben funktioniert, nur nicht für REST-Aufrufe:
2020-05-04_215343

Ich habe diese installiert:
Klicken Sie auf == 7.1.1
colorama == 0.4.3
Colouredlogs == 14.0

Diese arbeiten alle mit Färbung:
von colorama importieren Fore, Back, Style
print (Fore.RED + 'etwas roter Text')
print ('033 [31m' + 'etwas roter Text')

Importklick
click.echo ('033 [31m' + 'etwas roter Text')

von Flask:
"← [37mGET" <- dies könnte im Code ungültig maskiert werden (benötigt doppelte Schrägstriche?), Es hat bei mir mit einfach funktioniert

Ich konnte das Problem beheben, indem ich meiner Kolben-App den folgenden Code hinzufügte

import os
import sys

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

Weitere Informationen finden Sie unter https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python .

Es scheint, dass die doppelten Klammern in den Protokollen gefiltert werden, wie von @ mrx23dot vorgeschlagen.

Ich habe noch etwas Zeit damit verbracht, dieses Problem zu untersuchen. Der Farbzusatz stammt von click.style . Hier ist der relevante Code von 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)

Sie können sehen, dass die Funktion click.style die ursprüngliche Nachricht einfach in ANSI-Stilcodes einschließt. Unter Linux und OS X werden ANSI-Codes standardmäßig unterstützt, sodass diese Benutzer dieses Problem nicht bemerken. Unter Windows unterstützt das Terminal dies jedoch standardmäßig nicht. Wenn Sie Windows 10 verwenden, besteht eine einfache Problemumgehung darin, den folgenden Befehl zu verwenden, um das ANSI-Styling zu aktivieren:

import sys
import os

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

Dies wird die meisten Benutzer mit dem Problem ansprechen, einige Randfälle jedoch möglicherweise nicht beheben (z. B. geringer Platzbedarf oder eingebettete Unix-Distributionen). Das os.system('color') (oder wirklich jeder os.system -Anruf) kann fast überall in der Codebasis platziert werden. Solange es aufgerufen wird, bevor die Ausgabe gedruckt wird, wird die Ausgabe in der richtigen Farbe angezeigt. Dies ist wahrscheinlich der Grund, warum Benutzer von PyCharm den Fehler nicht bemerken. Das PyCharm-Python-Terminal ruft wahrscheinlich os.system auf, um die Ausgabe von farbigem Text zu verarbeiten.

So wie ich das sehe, gibt es zwei Fragen:

  1. Sollte werkzeug dieses kleinere Problem beheben oder Windows 10-Benutzern die Last überlassen, os.system anzurufen?
  2. Wenn wir dies in werkzeug beheben, wo sollen wir den Aufruf os.system hinzufügen? Es muss nur einmal aufgerufen werden, also könnte es vielleicht zu WSGIRequestHandler.__init__ hinzugefügt werden? Es gibt wahrscheinlich bessere Optionen, aber das ist alles, woran ich jetzt denken kann.

Ich konnte das Problem beheben, indem ich meiner Kolben-App den folgenden Code hinzufügte

import os
import sys

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

Weitere Informationen finden Sie unter https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python .

Es scheint, dass die doppelten Klammern in den Protokollen gefiltert werden, wie von @ mrx23dot vorgeschlagen.

Vielen Dank. Füge den Code in config.py hinzu, er funktioniert bei mir. 😀

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

caiz picture caiz  ·  3Kommentare

golf-player picture golf-player  ·  10Kommentare

KangOl picture KangOl  ·  16Kommentare

miki725 picture miki725  ·  10Kommentare

sorenh picture sorenh  ·  4Kommentare