Werkzeug: Windowsコンソールの色付けに失敗する

作成日 2020年05月03日  ·  6コメント  ·  ソース: pallets/werkzeug

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

bug

最も参考になるコメント

フラスコアプリに次のコードを追加することで問題を修正できました

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実行:
image

Windows 10 x64、Python 3.7.4、フラスコ1.1.2、Werkzeug1.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からインポートフォア、バック、スタイル
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つの質問があります:

  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 評価

関連する問題

davidism picture davidism  ·  9コメント

abathur picture abathur  ·  13コメント

SimonSapin picture SimonSapin  ·  12コメント

ngaya-ll picture ngaya-ll  ·  8コメント

asottile picture asottile  ·  11コメント