Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I print colored output to the terminal in Python?

Tags:

python

Is there a Python equivalent of Perl's

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

available?

I am using this approach:

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

what I want is I should be able to set color for all print messages like,

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

Here 'function_print_something' is my python function which will print some formatted log messages on to the screen.

like image 936
Turbo Sullivan Avatar asked May 20 '16 07:05

Turbo Sullivan


People also ask

How do I print color text in terminal?

import os # System call os. system("") # Class of different styles class style(): BLACK = '\033[30m' RED = '\033[31m' GREEN = '\033[32m' YELLOW = '\033[33m' BLUE = '\033[34m' MAGENTA = '\033[35m' CYAN = '\033[36m' WHITE = '\033[37m' UNDERLINE = '\033[4m' RESET = '\033[0m' print(style.

How do you display colored text in Python?

Method 1: Using ANSI ESCAPE CODE To add color and style to text, you should create a class called ANSI, and inside this class, declare the configurations about the text and color with code ANSI. Functions Used: background: allows background formatting. Accepts ANSI codes between 40 and 47, 100 and 107.

How do you print a color code in Python?

The easiest way is to open the '. py' file with Notepad++ and there you can select and modify your settings and preferences (any theme you want for your python codes) to export the python file to a colorful PDF file (using PDF Virtual Printer) or directly print it :-) .


2 Answers

Would the Python termcolor module do? This would be a rough equivalent for some uses.

from termcolor import colored  print colored('hello', 'red'), colored('world', 'green') 

The example is right from this post, which has a lot more. Here is a part of the example from docs

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

A specific requirement was to set the color, and presumably other terminal attributes, so that all following prints are that way. While I stated in the original post that this is possible with this module I now don't think so. See the last section for a way to do that.

However, most of the time we print short segments of text in color, a line or two. So the interface in these examples may be a better fit than to 'turn on' a color, print, and then turn it off. (Like in the Perl example shown.) Perhaphs you can add optional argument(s) to your print function for coloring the output as well, and in the function use module's functions to color the text. This also makes it easier to resolve occasional conflicts between formatting and coloring. Just a thought.


Here is a basic approach to set the terminal so that all following prints are rendered with a given color, attributes, or mode.

Once an appropriate ANSI sequence is sent to the terminal, all following text is rendered that way. Thus if we want all text printed to this terminal in the future to be bright/bold red, print ESC[ followed by the codes for "bright" attribute (1) and red color (31), followed by 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 ..." 

To turn off any previously set attributes use 0 for attribute, \033[0;35m (magenta).

To suppress a new line in python 3 use print('...', end=""). The rest of the job is about packaging this for modular use (and for easier digestion).

File 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" 

I recommend a quick read through some references on codes. Colors and attributes can be combined and one can put together a nice list in this package. 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." 

If the constant use of sys.stdout.write() is a bother it can be be wrapped in a tiny function, or the package turned into a class with methods that set terminal behavior (print ANSI codes).

Some of the above is more of a suggestion to look it up, like combining reverse mode and color. (This is available in the Perl module used in the question, and is also sensitive to order and similar.)


A convenient list of escape codes is surprisingly hard to find, while there are many references on terminal behavior and how to control it. The Wiki page on ANSI escape codes has all information but requires a little work to bring it together. Pages on Bash prompt have a lot of specific useful information. Here is another page with straight tables of codes. There is much more out there.

This can be used alongside a module like termocolor.

like image 194
zdim Avatar answered Oct 07 '22 23:10

zdim


I suggest sty. It's similar to colorama, but less verbose and it supports 8bit and 24bit colors. You can also extend the color register with your own colors.

Examples:

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

Demo:

enter image description here

like image 33
Rotareti Avatar answered Oct 07 '22 23:10

Rotareti