我该如何在Python中向终端输出彩色文本?
这在某种程度上取决于您所使用的平台。最常见的方法是通过打印ANSI转义序列来实现。以下是一些Blender构建脚本中的Python代码,作为简单的示例:
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'
print(bcolors.WARNING + "Warning: No active frommets remain. Continue?" + bcolors.ENDC)
或者,使用Python 3.6+:
print(f"{bcolors.WARNING}Warning: No active frommets remain. Continue?{bcolors.ENDC}")
tput
(像这样https://gist.github.com/4007035),因为它会产生更具可移植性的代码。 - Martin Uedingdisable
的一个真正应用场景是将输出重定向到文件时;虽然像 cat
这样的工具可能支持颜色,但通常最好不要将颜色信息打印到文件中。 - Sebastian Machimport 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还有一个Python termcolor模块。使用非常简单:
from termcolor import colored
print colored('hello', 'red'), colored('world', 'green')
或者在Python 3中:
print(colored('hello', 'red'), colored('world', 'green'))
它可能不够复杂,但对于游戏编程和您想要进行的“彩色块”可能不够适用...
要在Windows上使ANSI代码起作用,请先运行
os.system('color')
termcolor.COLORS
给出了一个颜色列表。 - akxlros.system('color')
,然后 ANSI 转义序列开始起作用。 - Szabolcsfrom colorama import init as colorama_init
from colorama import Fore
from colorama import Style
colorama_init()
print(f"This is {Fore.GREEN}color{Style.RESET_ALL}!")
打印一个以颜色/样式开头的字符串,然后是字符串本身,最后使用'\x1b[0m'
结束颜色/样式更改:
print('\x1b[6;30;42m' + 'Success!' + '\x1b[0m')
使用以下代码获取用于shell文本的表格格式选项:
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()
定义以颜色开始的字符串和以颜色结束的字符串。然后在文本前面使用开始字符串,在文本结尾处使用结束字符串并打印你的文本。
CRED = '\033[91m'
CEND = '\033[0m'
print(CRED + "Error, does not compute!" + CEND)
在 Bash 中,使用 Zenburn 风格的颜色方案,在 urxvt
中将产生以下结果:
通过实验,我们可以获得更多的颜色:
注意:\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
\33[25m
应该表示“不闪烁”,而不会重置其他样式 - https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters - Roland Pihlakas以下是适用于Windows 10本地的解决方案。
使用系统调用,例如os.system(“”)
,允许在命令提示符和PowerShell中本地打印颜色:
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.YELLOW + "Hello, World!")
注意:Windows不完全支持ANSI代码,无论是通过系统调用还是模块。并非所有的文本装饰都被支持,尽管明亮的颜色会显示出来,但它们与常规颜色相同。
感谢@j-l找到了一种更短的方法。
tl;dr: 添加os.system(“”)
os.system('')
来进一步简化if sys.platform.lower() == "win32": os.system('color')
。 不需要条件,这段代码在Windows 10和Linux上都可以运行(经过我的测试)。 正如您所看到的,您无需调用color
。 对于调用dir
,cd
,abcdef
和一个空字符串,一切都正常工作(虽然非空字符串可能会打印出您不想看到的输出)。 - J-Lcolor
命令,而是在于os.system(command)
这一行代码本身。而且,“command”可以是任何内容,甚至可以为空字符串。 - J-Los.system("")
会使颜色代码起作用? - Starwarswiiprintf(fmt, ...);
并在调用system("");
(包括<stdlib.h>)后使用ANSI代码打印出彩色文本。我仍然很好奇为什么会这样? - some devos.system("")
使这个工作的最可能原因是它在打开管道或控制台句柄时某种程度上启用了(Windows10)虚拟终端
(VT) 设置和UTF-8(无BOM)。也许这个答案是正确的。您可以尝试使用这里的方法设置ENABLE_VIRTUAL_TERMINAL_PROCESSING
来进行实验。 - not2qubit你想了解 ANSI 转义序列。这里是一个简短的例子:
CSI = "\x1B["
print(CSI+"31;40m" + "Colored Text" + CSI + "0m")
想要了解更多信息,请参阅 ANSI转义代码。
如果需要块字符,可以尝试使用Unicode字符,例如 \u2588:
print(u"\u2588")
把所有东西放在一起:
print(CSI+"31;40m" + u"\u2588" + CSI + "0m")
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"31;40m"
和"0m"
的目的是什么? - Qohelet0m
告诉终端停止使用该颜色。 - Bryan Oakleysty 类似于 colorama,但更简洁,支持 8 位 和 24 位(RGB)颜色,支持所有 效果(加粗、下划线等),允许您 注册自己的样式,类型完备且性能优异,支持 静音,不会影响全局对象如 sys.stdout
,非常灵活,文档详尽等特点。
示例:
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')
打印:
演示:
fg.rs
和 bg.rs
分别将前景色和背景色重置为默认值。 - MRule在我看来,这是最简单的方法。只要您有所需颜色的RGB值,这个方法就可以使用:
def colored(r, g, b, text):
return f"\033[38;2;{r};{g};{b}m{text}\033[0m"
打印红色文字的示例:
text = 'Hello, World!'
colored_text = colored(255, 0, 0, text)
print(colored_text)
#or
print(colored(255, 0, 0, 'Hello, World!'))
多彩文字
text = colored(255, 0, 0, 'Hello, ') + colored(0, 255, 0, 'World')
print(text)
█
唯一的问题是它属于扩展 ASCII,也许你可以使用http://stackoverflow.com/questions/8465226/using-extended-ascii-codes-with-python
来解决它。 - Samie Bencherif