如何在Python的终端中打印彩色文本?


2123

如何在Python中将彩色文本输出到终端?代表实体块的最佳Unicode符号是什么?


6
您应该指定一些其他信息以便获得更好的响应:多平台?是否接受外部模块?
sorin

2
IPython是跨平台的。看看他们用什么?
endlith 2010年

该符号将成为一个彩色的块: 唯一的问题是它是扩展的ASCII,也许您可​​以使用它来工作http://stackoverflow.com/questions/8465226/using-extended-ascii-codes-with-python
Samy Bencherif 2013年

一些终端还可以显示Unicode字符。如果这对于您的终端是正确的,则可能的字符几乎是无限的。
ayke

4
这个答案来得很晚,但是对我来说似乎是最好的……上面的投票对Windows要求特别的黑客,而这个方法
确实

Answers:


1829

这在某种程度上取决于您所使用的平台。最常见的方法是打印ANSI转义序列。对于一个简单的示例,这是Blender构建脚本中的一些python代码:

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

要使用这样的代码,您可以执行以下操作

print(bcolors.WARNING + "Warning: No active frommets remain. Continue?" + bcolors.ENDC)

或者,使用Python3.6 +:

print(f"{bcolors.WARNING}Warning: No active frommets remain. Continue?{bcolors.ENDC}")

这将在包括OS X,Linux和Windows的Unix上运行(前提是您使用ANSICON,或者在Windows 10中,前提是您启用了VT100仿真)。有用于设置颜色,移动光标等的ansi代码。

如果您要对此进行复杂化处理(听起来就像是在编写游戏),则应查看“ curses”模块,该模块为您处理了许多复杂的部分。在Python的诅咒HOWTO是一个很好的介绍。

如果您没有使用扩展的ASCII码(即不在PC上),那么您将只能使用127以下的ASCII字符,而“#”或“ @”可能是您最好的选择。如果可以确保您的终端使用的是IBM 扩展的ascii字符集,那么您还有更多选择。字符176、177、178和219是“块字符”。

一些现代的基于文本的程序,例如“矮人要塞”,以图形模式模拟文本模式,并使用经典PC字体的图像。您可以在Dwarf Fortress Wiki see(用户制作的tileset)上找到一些可以使用的位图。

文本模式设计大赛已在文本模式下做图形更多的资源。

嗯..我认为这个答案有点过头了。不过,我正在计划一个史诗般的基于文本的冒险游戏。祝您彩色文字好运!


但是,假设我的默认提示不是黑色-您认为在这些技巧之后可以使python resotre吗?
Adobe

4
在Linux上,你可能想使用tput像这样因为它会导致更轻便的代码。
Martin Ueding '11

3
@Cawas:真正的用例disable是将输出通过管道传输到文件中;虽然类似的工具cat可能支持颜色,但通常最好不要将颜色信息打印到文件中。
塞巴斯蒂安·马赫2014年

1
@AlexanderSimko,这是一个ctypes代码片段,用于在Windows 10中启用VT100支持import ctypes; kernel32 = ctypes.WinDLL('kernel32'); hStdOut = kernel32.GetStdHandle(-11); mode = ctypes.c_ulong(); kernel32.GetConsoleMode(hStdOut, ctypes.byref(mode)); mode.value |= 4; kernel32.SetConsoleMode(hStdOut, mode)
Eryk Sun'9

1
对于使用答案中的Python示例代码的任何人:应该注意,90-97和100-107范围内的颜色是非标准的,实际上,在我的终端上,它们并没有全部给出由变量名。最好使用标准范围30-37和40-47。资料来源:en.wikipedia.org/wiki/…–
balu

803

我很惊讶没有人提到Python termcolor模块。用法很简单:

from termcolor import colored

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

或在Python 3中:

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

但是,对于游戏编程和您要执行的“彩色块”来说,它可能不够复杂...


2
由于它发出ANSI代码,因此如果加载了ansi.sys,它是否可以在Windows(DOS控制台)上运行? support.microsoft.com/kb/101875
Phil P

37
刚刚注意到,从
2011年1

12
自2011
-Janus Troelsen

5
termcolor.COLORS为您提供颜色列表
akxlr

23
首先在Windows上运行os.system('color'),然后ANSI转义序列开始工作。
Szabolcs

717

答案是Colorama,用于Python中的所有跨平台着色。

Python 3.6示例屏幕截图: 屏幕截图示例


317
作为Colorama的作者,感谢您提到@ nbv4。我将尝试澄清一下:Colorama旨在让Python程序使用与该页面上其他答案相同的ANSI代码,在所有平台上打印彩色的终端文本。在Windows上,Colorama从stdout中剥离这些ANSI字符,并将其转换为等效的win32彩色文本调用。在其他平台上,Colorama不执行任何操作。因此,您可以使用ANSI代码或诸如Termcolor之类的模块,并且与Colorama一起使用,它们在所有平台上都“有效”。是那个主意吗?
乔纳森·哈特利

2
@Jonathan,这真是一个很棒的图书馆!跨平台颜色Python输出的功能确实非常有用。我正在为着色自己的控制台的库提供工具。我可以将该控制台的输出重定向到终端并为输出着色。现在,我什至可以上色库,让用户选择颜色。这将使色盲人员能够使事情正常进行,以便他们实际上可以正确看到输出。感谢
Demolishun

50
我认为这应该在标准库中。跨平台颜色支持很重要。
daviewales

5
科罗拉多州很棒!也可以看看ansimarkup,它是基于colorama构建的,允许您使用基于标签的简单标记(例如<b>bold</b>)为终端文本添加样式
gvalkov

30
如果不调用colorama.init(),这将无法正常工作。投票!
Smit Johnth '18

427

打印一个以颜色/样式开头的字符串,然后打印该字符串,然后通过以下命令结束颜色/样式更改'\x1b[0m'

print('\x1b[6;30;42m' + 'Success!' + '\x1b[0m')

成功的绿色背景示例

使用以下代码获取外壳程序文本的格式选项表:

def print_format_table():
    """
    prints table of formatted text format options
    """
    for style in range(8):
        for fg in range(30,38):
            s1 = ''
            for bg in range(40,48):
                format = ';'.join([str(style), str(fg), str(bg)])
                s1 += '\x1b[%sm %s \x1b[0m' % (format, format)
            print(s1)
        print('\n')

print_format_table()

浅色示例(完整)

在此处输入图片说明

暗光示例(部分)

输出的顶部


8
这适用于大多数shell和ipython,对大多数应用程序都足够好
dashesy 2014年

4
请问这是哪个航站楼?
FlipTack

4
它有多便携?
Ruggero Turra


203

定义一个以颜色开头的字符串和一个以颜色结尾的字符串,然后打印您的文本,其中起始字符串在前面,结尾字符串在结尾。

CRED = '\033[91m'
CEND = '\033[0m'
print(CRED + "Error, does not compute!" + CEND)

这会产生bash,并urxvt带有Zenburn风格的配色方案:

输出颜色

通过实验,我们可以获得更多的颜色:

颜色矩阵

注意:\33[5m\33[6m闪烁。

这样,我们可以创建完整的颜色集合:

CEND      = '\33[0m'
CBOLD     = '\33[1m'
CITALIC   = '\33[3m'
CURL      = '\33[4m'
CBLINK    = '\33[5m'
CBLINK2   = '\33[6m'
CSELECTED = '\33[7m'

CBLACK  = '\33[30m'
CRED    = '\33[31m'
CGREEN  = '\33[32m'
CYELLOW = '\33[33m'
CBLUE   = '\33[34m'
CVIOLET = '\33[35m'
CBEIGE  = '\33[36m'
CWHITE  = '\33[37m'

CBLACKBG  = '\33[40m'
CREDBG    = '\33[41m'
CGREENBG  = '\33[42m'
CYELLOWBG = '\33[43m'
CBLUEBG   = '\33[44m'
CVIOLETBG = '\33[45m'
CBEIGEBG  = '\33[46m'
CWHITEBG  = '\33[47m'

CGREY    = '\33[90m'
CRED2    = '\33[91m'
CGREEN2  = '\33[92m'
CYELLOW2 = '\33[93m'
CBLUE2   = '\33[94m'
CVIOLET2 = '\33[95m'
CBEIGE2  = '\33[96m'
CWHITE2  = '\33[97m'

CGREYBG    = '\33[100m'
CREDBG2    = '\33[101m'
CGREENBG2  = '\33[102m'
CYELLOWBG2 = '\33[103m'
CBLUEBG2   = '\33[104m'
CVIOLETBG2 = '\33[105m'
CBEIGEBG2  = '\33[106m'
CWHITEBG2  = '\33[107m'

这是生成测试的代码:

x = 0
for i in range(24):
  colors = ""
  for j in range(5):
    code = str(x+j)
    colors = colors + "\33[" + code + "m\\33[" + code + "m\033[0m "
  print(colors)
  x=x+5

2
您如何使txt闪烁
WiLL_K,

2
什么外壳或端子使其闪烁?
Zypps987

1
例如(u)rxvt
qubodup

6
闪烁的文本确实非常好。但是我该如何停止呢?由于某些原因,所有连续打印均闪烁。我的终端认为是聚会时间!
上尉

3
在要闪烁的字符串末尾,放在\33[0mCEND上方。
Stiffy2000 '18

94

您想了解ANSI转义序列。这是一个简单的示例:

CSI="\x1B["
print(CSI+"31;40m" + "Colored Text" + CSI + "0m")

有关更多信息,请参见http://en.wikipedia.org/wiki/ANSI_escape_code

对于块字符,请尝试使用\ u2588这样的Unicode字符:

print(u"\u2588")

放在一起:

print(CSI+"31;40m" + u"\u2588" + CSI + "0m")

3
def d(*v): return '\x1B['+';'.join(map(str, v))+'m'然后尝试print ' '.join([d(k,i)+str(i%10)+d(0) for i in range(30,38)+range(40,48) for k in range(2)])
Evgeni Sergeev 2013年

这里的reset是什么意思?
MohitC '17

70

我之所以做出回应,是因为我找到了一种在Windows 10上使用ANSI代码的方法,这样您就可以更改文本的颜色而无需任何内置模块:

进行此工作的行是os.system("")或任何其他系统调用,它使您可以在终端中打印ANSI代码:

import os

os.system("")

# Group of Different functions for 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.YELLOW + "Hello, World!")

注意:尽管此选项与其他Windows选项具有相同的选项,但是Windows即使使用此技巧也无法完全支持ANSI代码。并非所有的文本装饰颜色都起作用,并且所有“明亮”颜色(代码90-97和100-107)显示的颜色与常规颜色相同(代码30-37和40-47)

编辑:感谢@jl查找更短的方法。

tl; dros.system("")在文件顶部附近添加。

Python版本: 3.6.7


2
这行得通-我对color命令在Windows终端中启用ANSI代码感到非常惊讶,我已经走了很多年,却不知道这是可能的-该命令本身并没有提供任何提示。
Stuart Axon

1
最简单,并且完美地工作。谢谢。
阿里(Ari)

3
需要明确的是,这将仅适用于Windows 10的工作
Anaksunaman

2
在Windows 7 / 8.1中不起作用。
Nikos

2
非常感谢您的回答,@ SimpleBinary!试一试您的答案,我发现您可以if sys.platform.lower() == "win32": os.system('color')通过简单地将其替换为just来进一步简化os.system('')。不需要任何条件,并且代码可以在Windows 10和Linux中运行(在我测试时)。如您所见,您无需对进行系统调用color。调用dircdabcdef,,只是一个空字符串做工精细(虽然非空字符串可能会打印你不希望看到的输出)。
JL

60

我最喜欢的方法是使用Blessings库(完整披露:我写了它)。例如:

from blessings import Terminal

t = Terminal()
print t.red('This is red.')
print t.bold_bright_red_on_black('Bright red on black')

要打印彩色砖,最可靠的方法是使用背景色打印空间。我用这种技术绘制了鼻子渐进式的进度条

print t.on_green(' ')

您也可以在特定位置打印:

with t.location(0, 5):
    print t.on_yellow(' ')

如果您在游戏过程中不得不考虑其他终端功能,也可以这样做。您可以使用Python的标准字符串格式来保持可读性:

print '{t.clear_eol}You just cleared a {t.bold}whole{t.normal} line!'.format(t=t)

Blessings的好处在于,它尽其所能在各种终端上工作,而不仅仅是(绝大多数)ANSI颜色终端。它还在使代码简洁明了的同时,将无法读取的转义序列保留在代码之外。玩得开心!


65
将颜色用作函数名称而不是参数是一种可疑的做法。
LtWorf

1
@LtWorf:getattr如果需要,可以轻松地使用它作为参数。或更可能的是,只需动态创建格式字符串即可。
jfs 2014年

8
@progo您可以做到这一点并不意味着您应该这样做。如果颜色是您可以传递的参数,则更为通用。
LtWorf

2
can just pass是python函数。
MaxNoe

2
请注意,在Windows上无法导入祝福,因此如果您的脚本需要跨平台,请不要使用它。
Adversus

58

sty与colorama相似,但较为冗长,支持8位24位(rgb)颜色,允许您注册自己的样式,支持静音,非常灵活,文档丰富,并且更多。

例子:

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

印刷品:

在此处输入图片说明

演示: 在此处输入图片说明


7
如果您考虑将它与colorama进行比较,那将非常有用,我更喜欢您的库,但仅仅是因为包装盒中的API越短越好,如果它更受欢迎,那将是很好的。谢谢!
维克多·加夫罗

我喜欢sty,并且尝试使用sty格式化字符串,一个问题是,当我打印多种颜色时,可以重置为以前的颜色而不是默认颜色吗?
intijk

@VictorGavro这是一个好主意!我可能会对文档进行比较。
Rotareti

@intijk您的问题确实不适合评论部分。对于此类问题,请创建一个新的SO问题或使用github问题跟踪器。
Rotareti

53

使用for循环生成一个具有所有颜色的类,以将每种颜色的组合最多迭代到100,然后编写一个带有python颜色的类。请按我的意愿复制并粘贴GPLv2:

class colors:
    '''Colors class:
    reset all colors with colors.reset
    two subclasses fg for foreground and bg for background.
    use as colors.subclass.colorname.
    i.e. colors.fg.red or colors.bg.green
    also, the generic bold, disable, underline, reverse, strikethrough,
    and invisible work with the main class
    i.e. colors.bold
    '''
    reset='\033[0m'
    bold='\033[01m'
    disable='\033[02m'
    underline='\033[04m'
    reverse='\033[07m'
    strikethrough='\033[09m'
    invisible='\033[08m'
    class fg:
        black='\033[30m'
        red='\033[31m'
        green='\033[32m'
        orange='\033[33m'
        blue='\033[34m'
        purple='\033[35m'
        cyan='\033[36m'
        lightgrey='\033[37m'
        darkgrey='\033[90m'
        lightred='\033[91m'
        lightgreen='\033[92m'
        yellow='\033[93m'
        lightblue='\033[94m'
        pink='\033[95m'
        lightcyan='\033[96m'
    class bg:
        black='\033[40m'
        red='\033[41m'
        green='\033[42m'
        orange='\033[43m'
        blue='\033[44m'
        purple='\033[45m'
        cyan='\033[46m'
        lightgrey='\033[47m'

44

试试这个简单的代码

def prRed(prt): print("\033[91m {}\033[00m" .format(prt))
def prGreen(prt): print("\033[92m {}\033[00m" .format(prt))
def prYellow(prt): print("\033[93m {}\033[00m" .format(prt))
def prLightPurple(prt): print("\033[94m {}\033[00m" .format(prt))
def prPurple(prt): print("\033[95m {}\033[00m" .format(prt))
def prCyan(prt): print("\033[96m {}\033[00m" .format(prt))
def prLightGray(prt): print("\033[97m {}\033[00m" .format(prt))
def prBlack(prt): print("\033[98m {}\033[00m" .format(prt))

prGreen("Hello world")

19
建议:定义返回该彩色字符串的lambda,而不是直接打印它们,以便可以将其与其他字符串结合使用。
gustafbstrom

34

在Windows上,您可以使用模块“ win32console”(在某些Python发行版中可用)或模块“ ctypes”(Python 2.5及更高版本)来访问Win32 API。

要查看完整的代码,同时支持方式,见色控制台报告代码Testoob

ctypes示例:

import ctypes

# Constants from the Windows API
STD_OUTPUT_HANDLE = -11
FOREGROUND_RED    = 0x0004 # text color contains red.

def get_csbi_attributes(handle):
    # Based on IPython's winconsole.py, written by Alexander Belchenko
    import struct
    csbi = ctypes.create_string_buffer(22)
    res = ctypes.windll.kernel32.GetConsoleScreenBufferInfo(handle, csbi)
    assert res

    (bufx, bufy, curx, cury, wattr,
    left, top, right, bottom, maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw)
    return wattr


handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
reset = get_csbi_attributes(handle)

ctypes.windll.kernel32.SetConsoleTextAttribute(handle, FOREGROUND_RED)
print "Cherry on top"
ctypes.windll.kernel32.SetConsoleTextAttribute(handle, reset)

2
老实说,这是仅适用于Windows的解决方案。所有其他答案仅是彼此的副本。
达尼洛

FWIW,在Windows上,使用支持ANSI序列的ConEmu可能会更省心(除了在本机终端上具有许多其他优点)。拥有本地解决方案仍然很棒。
Endre均为

我和达尼洛在一起。
穆罕默德·阿里

24

基于@joeld的答案非常简单

class PrintInColor:
    RED = '\033[91m'
    GREEN = '\033[92m'
    YELLOW = '\033[93m'
    LIGHT_PURPLE = '\033[94m'
    PURPLE = '\033[95m'
    END = '\033[0m'

    @classmethod
    def red(cls, s, **kwargs):
        print(cls.RED + s + cls.END, **kwargs)

    @classmethod
    def green(cls, s, **kwargs):
        print(cls.GREEN + s + cls.END, **kwargs)

    @classmethod
    def yellow(cls, s, **kwargs):
        print(cls.YELLOW + s + cls.END, **kwargs)

    @classmethod
    def lightPurple(cls, s, **kwargs):
        print(cls.LIGHT_PURPLE + s + cls.END, **kwargs)

    @classmethod
    def purple(cls, s, **kwargs):
        print(cls.PURPLE + s + cls.END, **kwargs)

然后就

PrintInColor.red('hello', end=' ')
PrintInColor.green('world')

2
如果您传递多个位置参数或字符串类型以外的任何参数,这将导致崩溃
Romain Vincent

@RomainVincent然后,不要传递一个以上的位置参数或除字符串ty外的任何其他参数,等等,这些是print-replacements吗?异议被撤销。
wizzwizz4

1
@ wizzwizz4我不确定您对此评论的意思,但我还是看不出重点。如果您打算提出一个类...,以替换像print这样简单的方法,则最好避免使其变得容易碎裂。只是我的观点。
罗曼·文森特

1
@RomainVincent我要说的是您的反对意见是错误的,但是要替换功能一样多的功能,print应确保正确复制其功能。
wizzwizz4

1
@RomainVincent实现使用无限参数:<code> def purple(cls, *args, **kwargs): print(cls.PURPLE, *args, cls.END, **kwargs)</ code>
Emilien Baudet

23

我已经将@joeld答案包装到具有全局函数的模块中,可以在代码的任何地方使用它。

文件:log.py

HEADER = '\033[95m'
OKBLUE = '\033[94m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = "\033[1m"

def disable():
    HEADER = ''
    OKBLUE = ''
    OKGREEN = ''
    WARNING = ''
    FAIL = ''
    ENDC = ''

def infog( msg):
    print OKGREEN + msg + ENDC

def info( msg):
    print OKBLUE + msg + ENDC

def warn( msg):
    print WARNING + msg + ENDC

def err( msg):
    print FAIL + msg + ENDC

用途如下:

 import log
    log.info("Hello World")
    log.err("System Error")

22

对于Windows,除非使用win32api,否则无法使用颜色打印到控制台。

对于Linux,这就像使用print一样简单,这里概述了转义序列:

色彩

对于要像盒子一样打印的字符,实际上取决于您在控制台窗口中使用的字体。井字符号效果很好,但是取决于字体:

#

21
# Pure Python 3.x demo, 256 colors
# Works with bash under Linux and MacOS

fg = lambda text, color: "\33[38;5;" + str(color) + "m" + text + "\33[0m"
bg = lambda text, color: "\33[48;5;" + str(color) + "m" + text + "\33[0m"

def print_six(row, format, end="\n"):
    for col in range(6):
        color = row*6 + col - 2
        if color>=0:
            text = "{:3d}".format(color)
            print (format(text,color), end=" ")
        else:
            print(end="    ")   # four spaces
    print(end=end)

for row in range(0, 43):
    print_six(row, fg, " ")
    print_six(row, bg)

# Simple usage: print(fg("text", 160))

具有改变前景和背景的文本,颜色0..141 具有更改的前景和背景的文本,颜色142..255


20

我最终这样做了,我觉得那是最干净的:

formatters = {             
    'RED': '\033[91m',     
    'GREEN': '\033[92m',   
    'END': '\033[0m',      
}

print 'Master is currently {RED}red{END}!'.format(**formatters)
print 'Help make master {GREEN}green{END} again!'.format(**formatters)

如果没有第三方软件包,这样做真的很不错。
Jamie Counsell

20

使用https://pypi.python.org/pypi/lazyme 在@joeld答案上构建pip install -U lazyme

from lazyme.string import color_print
>>> color_print('abc')
abc
>>> color_print('abc', color='pink')
abc
>>> color_print('abc', color='red')
abc
>>> color_print('abc', color='yellow')
abc
>>> color_print('abc', color='green')
abc
>>> color_print('abc', color='blue', underline=True)
abc
>>> color_print('abc', color='blue', underline=True, bold=True)
abc
>>> color_print('abc', color='pink', underline=True, bold=True)
abc

屏幕截图:

在此处输入图片说明


color_print使用新的格式化程序对进行了一些更新,例如:

>>> from lazyme.string import palette, highlighter, formatter
>>> from lazyme.string import color_print
>>> palette.keys() # Available colors.
['pink', 'yellow', 'cyan', 'magenta', 'blue', 'gray', 'default', 'black', 'green', 'white', 'red']
>>> highlighter.keys() # Available highlights.
['blue', 'pink', 'gray', 'black', 'yellow', 'cyan', 'green', 'magenta', 'white', 'red']
>>> formatter.keys() # Available formatter, 
['hide', 'bold', 'italic', 'default', 'fast_blinking', 'faint', 'strikethrough', 'underline', 'blinking', 'reverse']

注:italicfast blinkingstrikethrough可能无法在所有终端上使用,在Mac / Ubuntu上也无法使用。

例如

>>> color_print('foo bar', color='pink', highlight='white')
foo bar
>>> color_print('foo bar', color='pink', highlight='white', reverse=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', bold=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', faint=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', faint=True, reverse=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', underline=True, reverse=True)
foo bar

屏幕截图:

在此处输入图片说明


20
def black(text):
    print('\033[30m', text, '\033[0m', sep='')

def red(text):
    print('\033[31m', text, '\033[0m', sep='')

def green(text):
    print('\033[32m', text, '\033[0m', sep='')

def yellow(text):
    print('\033[33m', text, '\033[0m', sep='')

def blue(text):
    print('\033[34m', text, '\033[0m', sep='')

def magenta(text):
    print('\033[35m', text, '\033[0m', sep='')

def cyan(text):
    print('\033[36m', text, '\033[0m', sep='')

def gray(text):
    print('\033[90m', text, '\033[0m', sep='')


black("BLACK")
red("RED")
green("GREEN")
yellow("YELLOW")
blue("BLACK")
magenta("MAGENTA")
cyan("CYAN")
gray("GRAY")

在线尝试


这仅适用于python3吗?在python2的sep =“''上收到错误
ScipioAfricanus

在python3 ubuntu 18.04中工作完美
Julius Prayogo

18

请注意,with关键字与需要重置的修饰符(使用Python 3和Colorama)混合的程度如何:

from colorama import Fore, Style
import sys

class Highlight:
  def __init__(self, clazz, color):
    self.color = color
    self.clazz = clazz
  def __enter__(self):
    print(self.color, end="")
  def __exit__(self, type, value, traceback):
    if self.clazz == Fore:
      print(Fore.RESET, end="")
    else:
      assert self.clazz == Style
      print(Style.RESET_ALL, end="")
    sys.stdout.flush()

with Highlight(Fore, Fore.GREEN):
  print("this is highlighted")
print("this is not")

尝试了彩色光,使用print(Style.BRIGHT + "Header Test")print (Style.DIM + word)创造一个非常好的提示。
汤姆(Tom)

这将需要更改以contextlib用于Py3。

@cat:那是什么版本的Python?
Janus Troelsen

我相信3以上-它上面应该有@contextlib.contextmanager装饰物,对吗?

1
@猫:为什么?没有,效果很好。
Janus Troelsen


17

您可以使用CLINT:

from clint.textui import colored
print colored.red('some warning message')
print colored.green('nicely done!')

从GitHub获取它


1
第一个链接消失了,所以我删除了它。GH链接仍然很好(尽管我已经收集到了该项目,尽管该项目已“存档”并且基本上已被放弃)。
Giacomo Lacava


14

我知道我迟到了。但是,我有一个名为ColorIt。非常简单。

这里有些例子:

from ColorIt import *

# Use this to ensure that ColorIt will be usable by certain command line interfaces
initColorIt()

# Foreground
print (color ('This text is red', colors.RED))
print (color ('This text is orange', colors.ORANGE))
print (color ('This text is yellow', colors.YELLOW))
print (color ('This text is green', colors.GREEN))
print (color ('This text is blue', colors.BLUE))
print (color ('This text is purple', colors.PURPLE))
print (color ('This text is white', colors.WHITE))

# Background
print (background ('This text has a background that is red', colors.RED))
print (background ('This text has a background that is orange', colors.ORANGE))
print (background ('This text has a background that is yellow', colors.YELLOW))
print (background ('This text has a background that is green', colors.GREEN))
print (background ('This text has a background that is blue', colors.BLUE))
print (background ('This text has a background that is purple', colors.PURPLE))
print (background ('This text has a background that is white', colors.WHITE))

# Custom
print (color ("This color has a custom grey text color", (150, 150, 150))
print (background ("This color has a custom grey background", (150, 150, 150))

# Combination
print (background (color ("This text is blue with a white background", colors.BLUE), colors.WHITE))

这给您:

ColorIt的图片

还值得注意的是,这是跨平台的,并且已经在Mac,Linux和Windows上进行了测试。

您可能想尝试一下:https : //github.com/CodeForeverAndEver/ColorIt

注意:几天后将添加闪烁,斜体,粗体等。


11

如果您使用的是Windows,那么就到这里!

# display text on a Windows console
# Windows XP with Python27 or Python32
from ctypes import windll
# needed for Python2/Python3 diff
try:
    input = raw_input
except:
    pass
STD_OUTPUT_HANDLE = -11
stdout_handle = windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
# look at the output and select the color you want
# for instance hex E is yellow on black
# hex 1E is yellow on blue
# hex 2E is yellow on green and so on
for color in range(0, 75):
     windll.kernel32.SetConsoleTextAttribute(stdout_handle, color)
     print("%X --> %s" % (color, "Have a fine day!"))
     input("Press Enter to go on ... ")

如果您想在同一行上使用不同的颜色,请在print("%X --> %s" % (color, "Have a fine day!"), end='', flush=True)
两次

11

如果您使用的是Django

>>> from django.utils.termcolors import colorize
>>> print colorize("Hello World!", fg="blue", bg='red',
...                 opts=('bold', 'blink', 'underscore',))
Hello World!
>>> help(colorize)

快照:

图片

(我通常在运行服务器终端上使用彩色输出进行调试,所以我添加了它。)

您可以测试它是否已安装在您的计算机中:
$ python -c "import django; print django.VERSION"
要安装它,请检查:如何安装Django

试试看!!


10

这是一个诅咒的例子:

import curses

def main(stdscr):
    stdscr.clear()
    if curses.has_colors():
        for i in xrange(1, curses.COLORS):
            curses.init_pair(i, i, curses.COLOR_BLACK)
            stdscr.addstr("COLOR %d! " % i, curses.color_pair(i))
            stdscr.addstr("BOLD! ", curses.color_pair(i) | curses.A_BOLD)
            stdscr.addstr("STANDOUT! ", curses.color_pair(i) | curses.A_STANDOUT)
            stdscr.addstr("UNDERLINE! ", curses.color_pair(i) | curses.A_UNDERLINE)
            stdscr.addstr("BLINK! ", curses.color_pair(i) | curses.A_BLINK)
            stdscr.addstr("DIM! ", curses.color_pair(i) | curses.A_DIM)
            stdscr.addstr("REVERSE! ", curses.color_pair(i) | curses.A_REVERSE)
    stdscr.refresh()
    stdscr.getch()

if __name__ == '__main__':
    print "init..."
    curses.wrapper(main)

您的代码在Windows(x64)下确实失败,并出现以下错误:AttributeError:'module'对象没有属性'
wrapper'– sorin

1
@Sorin Sbarnea:因此,以蟒蛇在诅咒正式文件docs.python.org/library/curses.html,诅咒模块不支持Windows。可能是您收到此错误,而不是“ No Such Module”或类似的错误,因为您可能将测试文件命名为“ curses.py”,因此它正在导入自身。
nosklo

10

https://raw.github.com/fabric/fabric/master/fabric/colors.py

"""
.. versionadded:: 0.9.2

Functions for wrapping strings in ANSI color codes.

Each function within this module returns the input string ``text``, wrapped
with ANSI color codes for the appropriate color.

For example, to print some text as green on supporting terminals::

    from fabric.colors import green

    print(green("This text is green!"))

Because these functions simply return modified strings, you can nest them::

    from fabric.colors import red, green

    print(red("This sentence is red, except for " + \
          green("these words, which are green") + "."))

If ``bold`` is set to ``True``, the ANSI flag for bolding will be flipped on
for that particular invocation, which usually shows up as a bold or brighter
version of the original color on most terminals.
"""


def _wrap_with(code):

    def inner(text, bold=False):
        c = code
        if bold:
            c = "1;%s" % c
        return "\033[%sm%s\033[0m" % (c, text)
    return inner

red = _wrap_with('31')
green = _wrap_with('32')
yellow = _wrap_with('33')
blue = _wrap_with('34')
magenta = _wrap_with('35')
cyan = _wrap_with('36')
white = _wrap_with('37')

10

asciimatics为构建文本UI和动画提供了可移植的支持:

#!/usr/bin/env python
from asciimatics.effects import RandomNoise  # $ pip install asciimatics
from asciimatics.renderers import SpeechBubble, Rainbow
from asciimatics.scene import Scene
from asciimatics.screen import Screen
from asciimatics.exceptions import ResizeScreenError


def demo(screen):
    render = Rainbow(screen, SpeechBubble('Rainbow'))
    effects = [RandomNoise(screen, signal=render)]
    screen.play([Scene(effects, -1)], stop_on_resize=True)

while True:
    try:
        Screen.wrapper(demo)
        break
    except ResizeScreenError:
        pass

Asciicast:

ASCII噪声中的彩虹色文本


10

另一个包装python 3打印功能的pypi模块:

https://pypi.python.org/pypi/colorprint

如果您也可以在python 2.x中使用它from __future__ import print。这是来自模块pypi页面的python 2示例:

from __future__ import print_function
from colorprint import *

print('Hello', 'world', color='blue', end='', sep=', ')
print('!', color='red', format=['bold', 'blink'])

输出“你好,世界!” 用蓝色和感叹号标记为红色和闪烁。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.