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

新手上路,请多包涵

有没有 Perl 的 Python 等价物

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

可用的?

我正在使用这种方法:

 "\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 函数,它将一些格式化的日志消息打印到屏幕上。

原文由 Turbo Sullivan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 384
2 个回答

Python termcolor 模块 可以吗?对于某些用途,这将是粗略的等价物。

 from termcolor import colored

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

该示例来自 这篇文章,其中包含更多内容。这是文档示例的一部分

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="") 。剩下的工作是将其打包以供模块化使用(以及更容易消化)。

文件 颜色.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"

我建议快速阅读一些代码参考。颜色和属性可以组合在一起,可以在这个包中组合一个漂亮的列表。一个脚本

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 模块中可用,并且对顺序和类似内容也很敏感。)


一个方便的转义码列表出奇地难以找到,但有很多关于终端行为以及如何控制它的参考资料。 ANSI 转义码上的 Wiki 页面 包含所有信息,但需要一些工作才能将它们组合在一起。 Bash 提示符 上的页面有很多特定的有用信息。这是 另一个带有直接代码表的页面。还有更多。

这可以与 termocolor 等模块一起使用。

原文由 zdim 发布,翻译遵循 CC BY-SA 3.0 许可协议

我建议 sty 。它类似于 colorama,但不那么冗长,并且支持 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')

在此处输入图像描述

演示:

在此处输入图像描述

原文由 Rotareti 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题