Werkzeug: Gagal mewarnai konsol Windows

Dibuat pada 3 Mei 2020  ·  6Komentar  ·  Sumber: pallets/werkzeug

Di windows, Flask baru mencetak karakter aneh di konsol, bukannya mewarnai garis seperti di linux. misalnya: "← [37m

Saya lebih suka hitam / putih (seperti di versi sebelumnya) jika pewarnaan tidak berhasil.

2020-05-03 14: 05: 47,398 - INFO - 127.0.0.1 - - [03 / Mei / 2020 14:05:47] "← [37mGET / hasil HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 06: 42,922 - INFO - 127.0.0.1 - - [03 / Mei / 2020 14:06:42] "← [37mGET / hasil HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 07: 24,007 - INFO - 127.0.0.1 - - [03 / Mei / 2020 14:07:24] "← [37mGET / hasil HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 07: 24,210 - INFO - 127.0.0.1 - - [03 / Mei / 2020 14:07:24] "← [37mGET /static/images/favicon.ico HTT
2020-05-03 14: 08: 19,539 - INFO - 127.0.0.1 - - [03 / Mei / 2020 14:08:19] "← [37mGET / hasil HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 09: 15,065 - INFO - 127.0.0.1 - - [03 / Mei / 2020 14:09:15] "← [37mGET / hasil HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 10: 10,579 - INFO - 127.0.0.1 - - [03 / Mei / 2020 14:10:10] "← [37mGET / hasil HTTP / 1.1 ← [0m" 200 -

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

bug

Komentar yang paling membantu

Saya dapat memperbaiki masalah ini dengan menambahkan kode berikut ke aplikasi flask saya

import os
import sys

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

Lihat https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python untuk detailnya.

Tampaknya tanda kurung ganda sedang difilter di log seperti yang disarankan @ mrx23dot .

Semua 6 komentar

Saya tidak dapat menggandakan.

Tampilan Command Prompt:
image

Terminal Pycharm:
image

PyCharm Run:
image

Saya menjalankan Windows 10 x64, Python 3.7.4, flask 1.1.2, Werkzeug 1.0.1

Saya tidak begitu yakin bagaimana menjelaskannya. Jika ada, adalah masalah dengan Click, tetapi Click tidak seharusnya memancarkan info warna pada Windows jika colorama tidak diinstal. Saya telah melihat lebih banyak laporan tentang ini sejak beralih ke Klik, tetapi tidak konsisten, seperti yang ditunjukkan pada tangkapan layar sebelumnya.

Diuji pada Win7 dan Win10 masalah yang sama, meskipun saya melihat pewarnaan berfungsi, hanya tidak untuk panggilan REST:
2020-05-04_215343

Saya telah menginstal ini:
klik == 7.1.1
colorama == 0.4.3
colorlogs == 14.0

Ini semua bekerja dengan pewarnaan:
dari colorama import Fore, Back, Style
cetak (Fore.RED + 'beberapa teks merah')
cetak ('033 [31m' + 'beberapa teks merah')

klik impor
click.echo ('033 [31m' + 'beberapa teks merah')

dari Flask:
"← [37mGET" <- ini mungkin lolos secara tidak valid dalam kode (perlu garis miring ke belakang ganda?), Itu berhasil untuk saya dengan satu

Saya dapat memperbaiki masalah ini dengan menambahkan kode berikut ke aplikasi flask saya

import os
import sys

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

Lihat https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python untuk detailnya.

Tampaknya tanda kurung ganda sedang difilter di log seperti yang disarankan @ mrx23dot .

Saya menghabiskan lebih banyak waktu untuk menyelidiki masalah ini. Penambahan warna berasal dari click.style . Berikut kode yang relevan dari 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)

Anda dapat melihat bahwa fungsi click.style hanya membungkus pesan awal dalam kode gaya ANSI. Untuk Linux dan OS X, kode ANSI didukung secara default, sehingga pengguna tersebut tidak akan menyadari masalah ini. Namun, di Windows, terminal tidak mendukung ini secara default. Jika menggunakan Windows 10, solusi sederhana adalah menggunakan perintah berikut untuk mengaktifkan gaya ANSI:

import sys
import os

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

Ini akan mengatasi sebagian besar pengguna dengan masalah tersebut, tetapi mungkin tidak memperbaiki beberapa kasus edge (misalnya footprint kecil atau distro unix tertanam). os.system('color') (atau benar-benar panggilan os.system ) dapat diletakkan hampir di mana saja dalam basis kode. Selama dipanggil sebelum keluaran dicetak, keluaran akan muncul dengan warna yang sesuai. Ini mungkin alasan mengapa pengguna PyCharm tidak memperhatikan bug tersebut. Terminal pyCharm python kemungkinan membuat panggilan os.system untuk menangani keluaran teks berwarna.

Jadi menurut saya ada 2 pertanyaan:

  1. Haruskah werkzeug memperbaiki masalah kecil ini atau membiarkan pengguna Windows 10 menelepon os.system ?
  2. Jika kita memperbaikinya di werkzeug, di mana kita harus menambahkan panggilan os.system ? Ini hanya perlu dipanggil sekali, jadi mungkin bisa ditambahkan ke WSGIRequestHandler.__init__ ? Mungkin ada pilihan yang lebih baik, tapi hanya itu yang bisa saya pikirkan sekarang.

Saya dapat memperbaiki masalah ini dengan menambahkan kode berikut ke aplikasi flask saya

import os
import sys

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

Lihat https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python untuk detailnya.

Tampaknya tanda kurung ganda sedang difilter di log seperti yang disarankan @ mrx23dot .

Terima kasih. tambahkan kode di config.py, ini berfungsi untuk saya. 😀

Apakah halaman ini membantu?
0 / 5 - 0 peringkat