Подтвердить что ты не робот

Как распечатать цветной вывод на терминал в Python?

Есть ли эквивалент python для perl's

print color 'red';
print <something>;
print color 'reset';

доступен в python?

Я знал решение,

"\x1b[1;%dm" % (<color code>) + "ERROR: log file does not exist" + "\x1b[0m"

Я хочу, чтобы я мог устанавливать цвет для всех сообщений печати, таких как

print color 'red'
function_print_something(<some message>)
print color 'reset'

Здесь функция function_print_something - это моя функция python, которая выводит на экран некоторые отформатированные сообщения журнала.

4b9b3361

Ответ 1

Будет ли Python termcolor module делать? Это будет грубым эквивалентом для некоторых видов использования.

from termcolor import colored

print colored('hello', 'red'), colored('world', 'green')

Пример находится прямо из этого сообщения, который имеет намного больше. Вот часть примера из docs

import sys
from termcolor import colored, cprint

text = colored('Hello, World!', 'red', attrs=['reverse', 'blink'])
print(text)
cprint('Hello, World!', 'green', 'on_red')

Особое требование заключалось в том, чтобы установить цвет и, предположительно, другие атрибуты терминала, чтобы все последующие отпечатки были такими. Хотя я заявил в оригинальной записи, что это возможно с этим модулем, я сейчас так не думаю. См. Последний раздел, чтобы сделать это.

Однако большую часть времени мы печатаем короткие сегменты текста в цвете, строку или две. Таким образом, интерфейс в этих примерах может быть лучше, чем "включить" цвет, печать и затем отключить его. (Как показано в примере с Perl.) Перхамы вы можете добавить необязательный аргумент к своей функции печати для окраски вывода, а также в функции использования функций модуля для окраски текста. Это также облегчает разрешение случайных конфликтов между форматированием и раскраской. Просто мысль.


Вот базовый подход для установки терминала, чтобы все последующие отпечатки отображались с заданным цветом, атрибутами или режимом.

Как только соответствующая последовательность ANSI отправляется на терминал, весь следующий текст отображается таким образом. Таким образом, если мы хотим, чтобы весь текст, напечатанный на этом терминале в будущем, был ярким/жирным красным, напечатайте ESC[, а затем коды для "яркого" атрибута (1) и красного цвета (31), а затем m

# print "\033[1;31m"   # this would emit a new line as well
import sys
sys.stdout.write("\033[1;31m")
print "All following prints will be red ..."

Чтобы отключить все ранее установленные атрибуты, используйте для атрибута 0, \033[0;35m (пурпурный).

Чтобы подавить новую строку в python 3, используйте print('...', end=""). Остальная часть работы заключается в упаковке для модульного использования (и для упрощения процесса пищеварения).

Файл colors.py

RED   = "\033[1;31m"  
BLUE  = "\033[1;34m"
CYAN  = "\033[1;36m"
GREEN = "\033[0;32m"
RESET = "\033[0;0m"
BOLD    = "\033[;1m"
REVERSE = "\033[;7m"

Я рекомендую быстро прочитать некоторые ссылки на коды. Цвета и атрибуты можно комбинировать, и в этом пакете можно составить хороший список. A script

import sys
from colors import *

sys.stdout.write(RED)
print "All following prints rendered in red, until changed"

sys.stdout.write(REVERSE + CYAN)
print "From now on change to cyan, in reverse mode"
print "NOTE: 'CYAN + REVERSE' wouldn't work"

sys.stdout.write(RESET)
print "'REVERSE' and similar modes need be reset explicitly"
print "For color alone this is not needed; just change to new color"
print "All normal prints after 'RESET' above."

Если постоянное использование sys.stdout.write() является проблемой, его можно обернуть в крошечную функцию или пакет превратился в класс с методами, которые устанавливают поведение терминала (печатать коды ANSI).

Некоторые из вышеперечисленных предложений - это скорее предложение поиска, например, комбинирование режима обратного хода и цвета. (Это доступно в модуле Perl, используемом в вопросе, а также чувствительно к порядку и тому подобному.)


Удобный список escape-кодов удивительно трудно найти, хотя есть много ссылок на поведение терминала и способы его управления. Страница Wiki на escape-кодах ANSI содержит всю информацию, но для ее объединения требуется небольшая работа. Страницы Bash prompt содержат много полезной информации. Здесь другая страница с прямыми таблицами кодов. Там гораздо больше.

Это можно использовать рядом с модулем типа termocolor.

Ответ 2

Я предлагаю свинарник. Он похож на колораму, но менее многословен и поддерживает 8-битные и 24-битные цвета. Вы также можете расширить регистр цветов своими собственными цветами.

Примеры:

from sty import fg, bg, ef, rs

foo = fg.red + 'This is red text!' + fg.rs
bar = bg.blue + 'This has a blue background!' + bg.rs
baz = ef.italic + 'This is italic text' + rs.italic
qux = fg(201) + 'This is pink text using 8bit colors' + fg.rs
qui = fg(255, 10, 10) + 'This is red text using 24bit colors.' + fg.rs

# Add custom colors:

from sty import Style, RgbFg

fg.orange = Style(RgbFg(255, 150, 50))

buf = fg.orange + 'Yay, Im orange.' + fg.rs

print(foo, bar, baz, qux, qui, buf, sep='\n')

enter image description here

Демонстрация:

enter image description here

Ответ 3

Вы можете попробовать это с Python 3:

from termcolor import colored
print(colored('Hello, World!', 'green', 'on_red'))

Если вы используете операционную систему Windows, приведенный выше код может не работать для вас. Тогда вы можете попробовать этот код:

from colorama import init
from termcolor import colored

# use Colorama to make Termcolor work on Windows too
init()

# then use Termcolor for all colored text output
print(colored('Hello, World!', 'green', 'on_red'))

Надеюсь, это поможет.

Ответ 4

Есть несколько библиотек, которые помогают здесь. Для инструментов cmdline я иногда использую colorama.

например.

from colorama import init, Fore, Back, Style
init()

def cprint(msg, foreground = "black", background = "white"):
    fground = foreground.upper()
    bground = background.upper()
    style = getattr(Fore, fground) + getattr(Back, bground)
    print(style + msg + Style.RESET_ALL)

cprint("colorful output, wohoo", "red", "black")

Но вместо использования строк вы можете использовать перечисление и/или добавить несколько проверок. Не самое прекрасное решение, но работает на osx/linux и windows и прост в использовании.

Другие темы по этой теме и кросс-платформенная поддержка: например. здесь.

Ответ 5

А как насчет библиотеки ansicolors? Вы можете просто сделать:

from colors import color, red, blue

# common colors
print(red('This is red'))
print(blue('This is blue'))

# colors by name or code
print(color('Print colors by name or code', 'white', '#8a2be2'))

Ответ 6

Библиотека Color_Console сравнительно проще в использовании. Установите эту библиотеку, и следующий код поможет вам.

from Color_Console import *
ctext("This will be printed" , "white" , "blue")
The first argument is the string to be printed, The second argument is the color of 
the text and the last one is the background color.

Последняя версия Color_Console позволяет передавать список или словарь цветов, которые будут меняться после заданного времени задержки.

Кроме того, они имеют хорошую документацию по всем своим функциям.

Посетите https://pypi.org/project/Color-Console/, чтобы узнать больше.