Windowsでは、新しいFlaskは、Linuxのように線に色を付ける代わりに、コンソールに奇妙な文字を印刷します。 例: "←[37m
着色がうまくいかない場合は、(以前のバージョンのように)黒/白にしたいと思います。
2020-05-03 14:05:47,398 --INFO-127.0.0.1 --- [03 / May / 2020 14:05:47] "←[37mGET / resultHTTP/1.1←[0m"200-
2020-05-03 14:06:42,922 --INFO-127.0.0.1 --- [03 / May / 2020 14:06:42] "←[37mGET / resultHTTP/1.1←[0m"200-
2020-05-03 14:07:24,007 --INFO-127.0.0.1 --- [03 / May / 2020 14:07:24] "←[37mGET / resultHTTP/1.1←[0m"200-
2020-05-03 14:07:24,210 --INFO-127.0.0.1 --- [03 / May / 2020 14:07:24] "←[37mGET / static / images / favicon.ico HTT
2020-05-03 14:08:19,539 --INFO-127.0.0.1 --- [03 / May / 2020 14:08:19] "←[37mGET / resultHTTP/1.1←[0m"200-
2020-05-03 14:09:15,065-情報-127.0.0.1 ---- [03 / May / 2020 14:09:15] "←[37mGET / resultHTTP/1.1←[0m"200-
2020-05-03 14:10:10,579-情報-127.0.0.1 --- [2020年5月3日14:10:10] "←[37mGET / resultHTTP/1.1←[0m"200-
環境:
フラスコ== 1.1.2
Win7 x64
Python 3.6.7 x64
Werkzeug == 1.0.1
複製できませんでした。
コマンドプロンプトビュー:
Pycharmターミナル:
PyCharm実行:
Windows 10 x64、Python 3.7.4、フラスコ1.1.2、Werkzeug1.0.1を実行しています
これをどう説明したらいいのかよくわかりません。 どちらかといえば、Clickの問題ですが、coloramaがインストールされていない場合、ClickはWindowsで色情報を出力することは想定されていません。 Clickに切り替えてから、これに関する報告が増えていますが、前のスクリーンショットに示されているように、一貫性がありません。
Win7とWin10の同じ問題でテストされましたが、REST呼び出しではなく、色付けが機能しているようです。
私はこれらをインストールしました:
クリック== 7.1.1
colorama == 0.4.3
Coloredlogs == 14.0
これらはすべてカラーリングで機能します。
coloramaからインポートフォア、バック、スタイル
print(Fore.RED + 'いくつかの赤いテキスト')
print( '033 [31m' + '赤いテキスト')
インポートクリック
click.echo( '033 [31m' + '赤いテキスト')
フラスコから:
"←[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およびOSXの場合、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
呼び出しを行う可能性があります。
だから私がそれを見る方法には2つの質問があります:
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が示唆しているように、二重括弧がログでフィルタリングされているようです。