Почему termcolor выводит управляющие символы вместо цветного текста в консоли Windows?
Я только что установил termcolor для Python 2.7 в Windows. Когда я пытаюсь напечатать цветной текст, я получаю вместо этого цветовые коды.
from termcolor import colored
print colored('Text text text', 'red')
Вот результат:
Я получаю те же результаты в 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)
Сделал работу:
вставка до импорта termcolor:
import subprocess
subprocess.call('', shell=True)
Не сработало:
- импорт колорамы (не) устранил проблему - все еще отображаются символы
- импорт / использование termcolor2 (не) устранили проблему - все еще отображаются
символы - Импорт colorama И termcolor2 И termcolor (не) устранил проблему.
Не могу объяснить, почему это работает, только то, что я смог сравнить один скрипт, который работал правильно, и тот, который работал некорректно.
Добавьте это, чтобы termcolor работал и в Windows:
import colorama
colorama.init()
Все вопросы и ответы, найденные в StackOverflow, похоже, ориентированы именно на Windows, но я хочу добавить, что приложения, созданные для Linux, тоже могут захотеть сделать это. Если вам когда-нибудь понадобится направить вывод вашей программы в новый файл из командной строки Linux (например,
Это работает как для 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))