Werkzeug: 无法为Windows控制台着色

创建于 2020-05-03  ·  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 /结果HTTP / 1.1←[0m” 200-
2020-05-03 14:06:42,922-信息-127.0.0.1--[03 / May / 2020 14:06:42]“←[37mGET /结果HTTP / 1.1←[0m” 200-
2020-05-03 14:07:24,007-信息-127.0.0.1--[03 / May / 2020 14:07:24]“←[37mGET /结果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 /结果HTTP / 1.1←[0m” 200-
2020-05-03 14:09:15,065-信息-127.0.0.1--[03 / May / 2020 14:09:15]“←[37mGET /结果HTTP / 1.1←[0m” 200-
2020-05-03 14:10:10,579-信息-127.0.0.1--[03 / May / 2020 14:10:10]“←[37mGET /结果HTTP / 1.1←[0m” 200-

信封:
烧瓶== 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

皮查姆码头:
image

PyCharm运行:
image

我正在运行Windows 10 x64,Python 3.7.4,flask 1.1.2,Werkzeug 1.0.1

我不太确定该如何解释。 如果有的话,这是Click的问题,但如果未安装colorama,则Click不应在Windows上发出颜色信息。 自从切换为Click以来,我已经看到了更多有关此的报告,但是不一致,如先前的屏幕快照所示。

在Win7和Win10上测试过相同的问题,尽管我看到着色有效,但不适用于REST调用:
2020-05-04_215343

我已经安装了这些:
点击== 7.1.1
colorama == 0.4.3
Coloredlogs == 14.0

这些都适用于着色:
从colorama导入前,后,样式
打印(前红色+“一些红色文字”)
打印('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用户不会注意到该错误的原因。 PyCharm python终端可能会调用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 等级

相关问题

mhelmetag picture mhelmetag  ·  8评论

taion picture taion  ·  7评论

penner42 picture penner42  ·  19评论

KangOl picture KangOl  ·  16评论

davidism picture davidism  ·  9评论