如何在Python中将彩色输出打印到终端?

时间:2016-05-20 07:03:53

标签: python

perl&#39>是否有任何python等价物

Listing Table
id -> int (autoincrement)
name -> varchar(25)
imagename -> varchar(10)
desription -> varchar(2000)
favorite -> boolean

在python中可用吗?

我知道解决方案;

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

我想要的是我应该可以为所有打印消息设置颜色,例如

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

这里&#39; function_print_something&#39;是我的python函数,它会将一些格式化的日志消息打印到屏幕上。

8 个答案:

答案 0 :(得分:70)

Python termcolor module会这么做吗?对于某些用途,这将是一个粗略的等价物。

from termcolor import colored

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

示例来自this post,其中包含更多内容。以下是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示例中所示。)Perhaphs你可以在打印函数中添加可选参数以便为输出着色,并在函数中使用模块的函数为文本着色。这也可以更容易地解决格式化和着色之间的偶然冲突。只是一个想法。

这是设置终端的基本方法,以便使用给定的颜色,属性或模式渲染所有后续打印。

一旦将适当的ANSI序列发送到终端,就会以这种方式呈现所有后续文本。因此,如果我们希望将来打印到此终端的所有文本都是明亮/粗体红色,请打印ESC[后跟“明亮”属性(1)和红色(31)的代码,然后是{{1 }}

m

要关闭任何先前设置的属性,请使用0表示属性# 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 ..." (品红色)。

要在python 3中抑制新行,请使用\033[0;35m。剩下的工作是将其打包用于模块化使用(并且更容易消化)。

档案 colors.py

print('...', end="")

我建议您快速阅读一些有关代码的参考资料。可以组合颜色和属性,并且可以在此包中放置一个很好的列表。一个脚本

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"

如果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." 的常量使用是麻烦的,它可以包装在一个小函数中,或者包变成一个类,其方法设置终端行为(打印ANSI代码)。

上面的一些更多的建议是查找它,例如组合反向模式和颜色。 (这在问题中使用的Perl模块中可用,并且对顺序和类似也很敏感。)

很容易找到一个方便的转义码列表,虽然有很多关于终端行为的引用以及如何控制它。 Wiki page on ANSI escape codes包含所有信息,但需要一些工作才能将它们组合在一起。 Bash prompt上的页面包含许多特定的有用信息。这是another page,带有直接的代码表。 还有更多。

这可以与sys.stdout.write()等模块一起使用。

答案 1 :(得分:12)

我建议all()。它与colorama相似,但不那么冗长,它支持sty8bit颜色。您还可以使用自己的颜色扩展颜色寄存器。

from sty import fg, bg, ef, rs, RgbFg

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 new colors:

fg.set_style('orange', RgbFg(255, 150, 50))

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

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

24bit

演示:

enter image description here

答案 2 :(得分:3)

有一些图书馆可以提供帮助。对于cmdline工具,我有时使用colorama

e.g。

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,并且易于使用。

有关此主题和跨平台支持的其他主题:e.g. here

答案 3 :(得分: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 :(得分:3)

旁注:Windows用户应首先运行os.system('color'),否则您将看到一些ANSI转义序列,而不是彩色输出。

答案 5 :(得分:2)

相比这里列出的方法,我更喜欢系统自带的方法。 在这里,我提供了一个更好的方法,无需第三方库。

class colors: # You may need to change color settings
    RED = '\033[31m'
    ENDC = '\033[m'
    GREEN = '\033[32m'
    YELLOW = '\033[33m'
    BLUE = '\033[34m'

print(colors.RED + "something you want to print in red color" + colors.ENDC)
print(colors.GREEN + "something you want to print in green color" + colors.ENDC)
print("something you want to print in system default color")

更多颜色代码,参考:Printing Colored Text in Python

尽情享受吧!

答案 6 :(得分:0)

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'))

答案 7 :(得分:0)

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/了解更多信息。