在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
我无法复制。
命令提示符视图:
皮查姆码头:
PyCharm运行:
我正在运行Windows 10 x64,Python 3.7.4,flask 1.1.2,Werkzeug 1.0.1
我不太确定该如何解释。 如果有的话,这是Click的问题,但如果未安装colorama,则Click不应在Windows上发出颜色信息。 自从切换为Click以来,我已经看到了更多有关此的报告,但是不一致,如先前的屏幕快照所示。
在Win7和Win10上测试过相同的问题,尽管我看到着色有效,但不适用于REST调用:
我已经安装了这些:
点击== 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
来处理彩色文本输出。
所以我的看法有两个问题:
os.system
?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中添加代码,对我有用。 😀
最有用的评论
通过将以下代码添加到我的烧瓶应用程序中,我可以解决此问题
有关详细信息,请参见https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python 。
似乎双括号在日志中已按照@ mrx23dot的建议进行过滤。