Почему termcolor выводит управляющие символы вместо цветного текста в консоли Windows?

Я только что установил termcolor для Python 2.7 в Windows. Когда я пытаюсь напечатать цветной текст, я получаю вместо этого цветовые коды.

from termcolor import colored
print colored('Text text text', 'red')

Вот результат:

Снимок экрана: окно консоли Windows со строкой: '← 31mText text text ← [0m'

Я получаю те же результаты в Far Manager и при попытке запустить скрипт как отдельное приложение.

9 ответов

Решение

Чтобы цвета ANSI, используемые в termcolor, работали с терминалом Windows, вам также необходимо импортировать / init colorama;

>>> from termcolor import *
>>> cprint('hello', 'red')
←[31mhello←[0m
>>> import colorama
>>> colorama.init()
>>> cprint('hello', 'red')
hello                                    <-- in red color
>>>

В командной строке Windows используется команда для изменения цвета вывода терминала. вы можете выполнить команду "цветовой код", чтобы мгновенно изменить цвет. Просто указание цвета команды активирует эту функцию цвета.

Вкратце.. Чтобы ваш скрипт работал, запустите это в начале вашего скрипта.

import os
os.system('color')

В модуле termcolor2 вы должны ввести это:

import termcolor2
import colorama
colorama.init()

myText = input("Type a text : ")
color = input("What color you want? : ")

print(termcolor2.colored(myText, color))

Это оно...

Очень простое решение - создать один класс, который определяет цвета и использовать его в функции. Вам не нужно импортировать какой-либо модуль, просто скопируйте его и вставьте: -

      class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKCYAN = '\033[96m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'


def c_print(color, text):
    if color == "green":
        return print(bcolors.OKGREEN + text + bcolors.ENDC)
    if color == "cyan":
        return print(bcolors.OKCYAN + text + bcolors.ENDC)
    if color == "blue":
        return print(bcolors.OKBLUE + text + bcolors.ENDC)

line = f"{bcolors.OKCYAN}It will wish you on every start up{bcolors.ENDC}"
c_print("cyan", line)

Изображение, показывающее цвет в cmd

Сделал работу:

вставка до импорта termcolor:

import subprocess
subprocess.call('', shell=True)

Не сработало:

  1. импорт колорамы (не) устранил проблему - все еще отображаются символы
  2. импорт / использование termcolor2 (не) устранили проблему - все еще отображаются
    символы
  3. Импорт colorama И termcolor2 И termcolor (не) устранил проблему.

Не могу объяснить, почему это работает, только то, что я смог сравнить один скрипт, который работал правильно, и тот, который работал некорректно.

Добавьте это, чтобы termcolor работал и в Windows:

      import colorama
colorama.init()

Все вопросы и ответы, найденные в StackOverflow, похоже, ориентированы именно на Windows, но я хочу добавить, что приложения, созданные для Linux, тоже могут захотеть сделать это. Если вам когда-нибудь понадобится направить вывод вашей программы в новый файл из командной строки Linux (например, ), вы можете увидеть в этом файле странные управляющие символы! Это часто нежелательно, особенно в файлах журнала, которые используют системные администраторы. Приведенный выше фрагмент кода устраняет эту проблему для меня в Ubuntu.

Это работает как для Linux, так и для Windows, если сначала очистить экран.

      import os

def clr():
    _ = os.system("cls" if os.name == "nt" else "clear")


clr()
for i in range(0, 16):
    for j in range(0, 16):
        color_code = str(i * 16 + j)
        print("\033[38;5;" + color_code + "m" + color_code.rjust(4), end='')
    print("\033[0m")

В современных системах Windows окно хоста консоли должно иметь режим ENABLE_VIRTUAL_TERMINAL_PROCESSING для правильной обработки цветовых последовательностей ANSI.

Никаких внешних зависимостей, чистый WinAPI (через ctypes):

      def enable_vt_processing():
   import ctypes
   STD_OUTPUT_HANDLE = -11
   handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
   mode = ctypes.c_ulong()
   ok = ctypes.windll.kernel32.GetConsoleMode(handle, ctypes.byref(mode))
   assert ok
   ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004
   ok = ctypes.windll.kernel32.SetConsoleMode(handle, ctypes.c_ulong(mode.value | ENABLE_VIRTUAL_TERMINAL_PROCESSING))
   assert ok

Вот простая функция, которую я считаю полезной для цветной печати. Вам не нужно производить импорт и запоминать сложные коды ANSI. Функция использует стандартные кортежи RGB для определения цвета переднего плана и фона. Палитру цветов RGB можно найти по адресу https://www.google.com/search?q=rgb+color+picker&oq=rgb+color+picker&aqs=chrome..69i57j0l7.5967j0j8& sourceid = chrome & ie = UTF-8

def print_in_color(txt_msg,fore_tupple,back_tupple,):
    #prints the text_msg in the foreground color specified by fore_tupple with the background specified by back_tupple 
    #text_msg is the text, fore_tupple is foregroud color tupple (r,g,b), back_tupple is background tupple (r,g,b)
    rf,gf,bf=fore_tupple
    rb,gb,bb=back_tupple
    msg='{0}' + txt_msg
    mat='\33[38;2;' + str(rf) +';' + str(gf) + ';' + str(bf) + ';48;2;' + str(rb) + ';' +str(gb) + ';' + str(bb) +'m' 
    print(msg .format(mat))
    print('\33[0m') # returns default print color to back to black

# example of use using a message with variables
fore_color='cyan'
back_color='dark green'
msg='foreground color is {0} and the background color is {1}'.format(fore_color, back_color)
print_in_color(msg, (0,255,255),(0,127,127))



Другие вопросы по тегам