Werkzeug: Не удается раскрасить консоль Windows

Созданный на 3 мая 2020  ·  6Комментарии  ·  Источник: pallets/werkzeug

В Windows новый Flask печатает странные символы на консоли вместо того, чтобы раскрашивать строку, как в Linux. например: "← [37m

Я бы предпочел черно-белый (как в предыдущей версии), если раскраска не работает.

2020-05-03 14: 05: 47,398 - ИНФОРМАЦИЯ - 127.0.0.1 - - [03 / May / 2020 14:05:47] "← [37mGET / result HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 06: 42,922 - ИНФОРМАЦИЯ - 127.0.0.1 - - [03 / May / 2020 14:06:42] "← [37mGET / result HTTP / 1.1 ← [0m" 200 -
2020-05-03 14:07: 24,007 - ИНФОРМАЦИЯ - 127.0.0.1 - - [03 / May / 2020 14:07:24] "← [37mGET / result HTTP / 1.1 ← [0m" 200 -
2020-05-03 14:07: 24,210 - ИНФОРМАЦИЯ - 127.0.0.1 - - [03 / May / 2020 14:07:24] "← [37mGET /static/images/favicon.ico HTT
2020-05-03 14:08: 19,539 - ИНФОРМАЦИЯ - 127.0.0.1 - - [03 / May / 2020 14:08:19] "← [37mGET / result HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 09: 15,065 - ИНФОРМАЦИЯ - 127.0.0.1 - - [03 / May / 2020 14:09:15] "← [37mGET / result HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 10: 10,579 - ИНФОРМАЦИЯ - 127.0.0.1 - - [03 / May / 2020 14:10:10] "← [37mGET / result HTTP / 1.1 ← [0m" 200 -

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

Самый полезный комментарий

Мне удалось исправить проблему, добавив следующий код в свое приложение для фляги

import os
import sys

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

Подробнее см. Https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python .

Похоже, что двойные скобки фильтруются в журналах, как предложил @ mrx23dot .

Все 6 Комментарий

Мне не удалось продублировать.

Просмотр командной строки:
image

Терминал Pycharm:
image

PyCharm Run:
image

Я использую Windows 10 x64, Python 3.7.4, flask 1.1.2, Werkzeug 1.0.1

Я не совсем понимаю, как это объяснить. Во всяком случае, это проблема с Click, но Click не должен выдавать информацию о цвете в Windows, если colorama не установлена. Я видел больше сообщений об этом после перехода на Click, но это не соответствует, как показано на предыдущих снимках экрана.

Протестировано на Win7 и Win10 с той же проблемой, хотя я вижу, что окраска работает, только не для вызовов REST:
2020-05-04_215343

У меня установлено:
нажмите == 7.1.1
colorama == 0.4.3
цветные журналы == 14.0

Все они работают с раскраской:
from colorama import Fore, Back, Style
print (Fore.RED + 'красный текст')
print ('033 [31m' + 'красный текст')

импорт нажмите
click.echo ('033 [31m' + 'красный текст')

из Flask:
"← [37mGET" <- это могло быть некорректно экранировано в коде (нужны двойные обратные косые черты?), У меня это сработало с одиночным

Мне удалось исправить проблему, добавив следующий код в свое приложение для фляги

import os
import sys

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

Подробнее см. Https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python .

Похоже, что двойные скобки фильтруются в журналах, как предложил @ mrx23dot .

Я потратил еще немного времени на изучение этой проблемы. Добавление цвета происходит от click.style . Вот соответствующий код из 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)

Вы можете видеть, что функция click.style просто обертывает исходное сообщение кодами стиля ANSI. Для Linux и OS X коды ANSI поддерживаются по умолчанию, поэтому эти пользователи не заметят этой проблемы. Однако в Windows терминал не поддерживает это по умолчанию. Если вы используете Windows 10, простой обходной путь - использовать следующую команду для включения стилей ANSI:

import sys
import os

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

Это решит проблему большинства пользователей, но может не исправить некоторые крайние случаи (например, компактные или встроенные дистрибутивы unix). os.system('color') (или любой вызов os.system ) можно поместить практически в любом месте базы кода. Пока он вызывается перед печатью вывода, вывод будет правильно окрашен. Вероятно, поэтому пользователи PyCharm не замечают ошибки. Терминал Python PyCharm, вероятно, выполняет вызов os.system для обработки вывода цветного текста.

На мой взгляд, есть два вопроса:

  1. Следует ли werkzeug исправить эту незначительную проблему или оставить бремя для пользователей Windows 10, чтобы они звонили os.system ?
  2. Если мы исправим это в werkzeug, куда мы должны добавить вызов os.system ? Его нужно вызвать только один раз, поэтому, возможно, его можно добавить к WSGIRequestHandler.__init__ ? Возможно, есть варианты получше, но это все, о чем я могу сейчас думать.

Мне удалось исправить проблему, добавив следующий код в свое приложение для фляги

import os
import sys

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

Подробнее см. Https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python .

Похоже, что двойные скобки фильтруются в журналах, как предложил @ mrx23dot .

Благодарю. добавьте код в config.py, у меня он работает. 😀

Была ли эта страница полезной?
0 / 5 - 0 рейтинги