如何将彩色文本打印到终端?

问:

如何在 Python 中将彩色文本输出到终端?

答1:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

这在某种程度上取决于您所在的平台。最常见的方法是打印 ANSI 转义序列。举个简单的例子,下面是 Blender build scripts 中的一些 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}")

这适用于包括 OS X、Linux 和 Windows 在内的 unix(前提是您使用 ANSICON,或者在 Windows 10 中启用 VT100 emulation)。有用于设置颜色、移动光标等的 ANSI 代码。

如果您对此感到复杂(如果您正在编写游戏,听起来您就是这样),您应该查看“curses”模块,它为您处理了很多复杂的部分。 Python Curses HowTO 是一个很好的介绍。

如果您不使用扩展 ASCII(即,不在 PC 上),您会被 127 以下的 ASCII 字符卡住,而“#”或“@”可能是您最好的选择。如果您可以确保您的终端使用的是 IBM extended ASCII character set,那么您有更多选择。字符 176、177、178 和 219 是“块字符”。

一些现代的基于文本的程序,例如“Dwarf Fortress”,以图形模式模拟文本模式,并使用经典 PC 字体的图像。您可以在 Dwarf Fortress Wiki 查看 (user-made tilesets) 中找到其中一些可以使用的位图。

Text Mode Demo Contest 有更多资源用于在文本模式下绘制图形。

在 Linux 上,您可能希望使用 tput、like so,因为它会产生更多可移植的代码。

@Cawas:disable 的一个真正用例是将输出通过管道传输到文件时;虽然像 cat 这样的工具可能支持颜色,但通常最好不要将颜色信息打印到文件中。

@AlexanderSimko,这是在 Windows 10 中启用 VT100 支持的 ctypes 代码片段: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)。

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

关于术语颜色如何工作的good reference:jafrog.com/2013/11/23/colors-in-terminal.html

答2:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

还有Python termcolor module。用法很简单:

from termcolor import colored

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

或者在 Python 3 中:

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

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

要让 ANSI 代码在 Windows 上运行,首先运行

os.system('color')

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

刚刚注意到截至 2011 年 1 月 13 日,它现在处于 MIT 许可下

没有单元测试(与 colorama 不同)并且自 2011 年以来未更新

termcolor.COLORS 为您提供颜色列表

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

答3:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

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

它支持 Python 3.5+ 以及 Python 2.7。

自 2021 年 1 月起,它得到维护。

示例代码:

from colorama import Fore
from colorama import Style

print(f"This is {Fore.GREEN}color{Style.RESET_ALL}!")

https://i.stack.imgur.com/q3D4W.png

作为 Colorama 的作者,感谢@nbv4 的提及。我将尝试澄清一下:Colorama 旨在让 Python 程序在所有平台上打印彩色终端文本,使用与本页许多其他答案中描述的相同的 ANSI 代码。在 Windows 上,Colorama 从标准输出中去除这些 ANSI 字符,并将它们转换为对彩色文本的等效 win32 调用。在其他平台上,Colorama 什么都不做。因此,您可以使用 ANSI 代码或诸如 Termcolor 之类的模块,并且使用 Colorama,它们可以在所有平台上“正常工作”。是这个想法,无论如何。

@Jonathan,这真是一个很棒的图书馆!跨平台彩色 Python 输出的能力真的非常好和有用。我正在为一个为自己的控制台着色的库提供工具。我可以将该控制台的输出重定向到终端并对输出进行着色。现在我什至可以创建一个库并让用户选择颜色。这将允许色盲人士设置工作,以便他们可以正确地看到输出。谢谢

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

色彩斑斓很棒!另请查看 ansimarkup,它基于 colorama 构建,允许您使用简单的基于标签的标记(例如 bold)为终端文本添加样式

如果不调用 colorama.init(),这是行不通的。投票!

答4:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

打印一个以颜色/样式开头的字符串,然后是字符串,然后以 ‘\x1b[0m’ 结束颜色/样式更改:

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

https://i.stack.imgur.com/RN3MN.png

使用以下代码获取 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()

明暗示例(完整)

https://i.stack.imgur.com/6otvY.png

明暗示例(部分)

https://i.stack.imgur.com/lZr23.png

参考:https://en.wikipedia.org/wiki/ANSI_escape_code#Colors

这适用于大多数 shell 以及 ipython,对于大多数应用程序来说已经足够了

请问,这是哪个终端?

它的便携性如何?

简短的独立实施:gist.github.com/Sheljohn/68ca3be74139f66dbc6127784f638920

要在 Windows 10 Powershell 中完成这项工作,请在 Python 中导入 os,然后执行 os.system('color')。从那时起,ANSI 转义序列将神奇地起作用。

答5:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

定义一个开始颜色的字符串和结束颜色的字符串。然后打印您的文本,开始字符串在前面,结束字符串在末尾。

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

这会在 urxvt 中使用 Zenburn 风格的配色方案在 Bash 中生成以下内容:

https://i.stack.imgur.com/Iu3I1.png

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

https://i.stack.imgur.com/j7e4i.gif

注意:\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

什么外壳或终端使它闪烁?

(u)rxvt 例如

仅供参考 - 上面标记为“米色”的是 Apple 终端上的浅青色(以及 Python 的许多其他颜色名称列表)。此外,一些双色是浅色/深色版本,我称之为白色和灰色的白色变体......

@captain \33[25m 也应该表示“不闪烁”,而不重置其他样式 - en.wikipedia.org/wiki/…

答6:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

这是一个原生适用于 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 代码,无论是通过系统调用还是模块。并非所有文本装饰都受支持,虽然显示的是亮色,但它们与常规颜色相同。

感谢@jl 找到了一个更短的方法。

tl;dr:添加 os.system(“”)

这行得通 - 我真的很惊讶 color 命令在 Windows 终端中启用了 ANSI 代码,我已经走了很多年而不知道这是可能的 - 命令本身并没有给出任何线索表明它可以做到这一点。

非常感谢您的回答,@SimpleBinary!根据您的答案,我发现您可以进一步简化 if sys.platform.lower() == "win32": os.system('color'),只需将其替换为 os.system('')。不需要条件,代码在 Windows 10 和 Linux 中都可以运行(当我测试它时)。如您所见,您不必对 color 进行系统调用。对 dir、cd、abcdef 和空字符串的调用都可以正常工作(尽管非空字符串可能会打印您不想看到的输出)。

简而言之,对 color 的调用不是关键部分。在 Windows 10 上运行时,正是 os.system(command) 行本身使打印颜色成为可能。“命令”实际上可以是任何东西——甚至只是一个空字符串。

这真的很有趣!为什么 os.system("") 会导致颜色代码起作用?

@Starwarswii这不是python的实现,在调用system("");(include )之后在Windows中使用ASNI代码运行printf(fmt, ...);的C中确实打印了彩色文本,我仍然很好奇为什么会这样?

答7:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

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

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

有关详细信息,请参阅 ANSI escape code。

对于块字符,请尝试使用 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)])

这里的reset是什么意思?

我一直在尝试这个解决方案。 "31;40m" 和 "0m" 的用途是什么?

@Qohelet:您是否点击了“ANSI 转义码”的链接?它解释了 ANSI 转义序列是如何工作的。第一组数字告诉终端开始使用特定的前景色和背景色,0m 告诉终端停止使用该颜色。

@BryanOakley - 我想知道这没有发生。 Python3.7 将其打印为常规文本。

答8:

huntsbot.com – 高效赚钱,自由工作

sty 类似于 colorama,但不那么冗长,支持 8-bit 和 24-bit (RGB) 颜色,支持所有 effects(粗体、下划线等),允许您使用 register your own styles,完全键入并且高性能,支持 muting,不会弄乱 sys.stdout 等全局变量,非常灵活,以及 documented 等等…

例子:

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

印刷:

https://i.stack.imgur.com/4BIdi.png

演示:

https://i.stack.imgur.com/S8wtO.png

如果您考虑将它与 colorama 进行比较,那将非常有用,我更喜欢您的库,但这只是因为盒子里的 api 更短,如果它更受欢迎那就太好了。谢谢!

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

@VictorGavro 这是个好主意!我可能会在文档中添加一个比较。

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

@intijk :使用代码 fg.rs 和 bg.rs 分别将前景色和背景色重置为默认值。

答9:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

Rich 是一个相对较新的 Python 库,用于在终端中处理颜色。

在 Rich 中有几种处理颜色的方法。最快的入门方法是丰富的打印方法,它将类似 BBCode 的语法呈现到 ANSI 控制代码中:

from rich import print
print("[red]Color[/] in the [bold magenta]Terminal[/]!")

还有其他方法可以使用 Rich(正则表达式、语法)和相关的格式功能来应用颜色。

https://i.stack.imgur.com/4jJaD.png

答10:

huntsbot.com – 高效赚钱,自由工作

我最喜欢的方式是使用 Blessings 库(完全公开:我写的)。例如:

from blessings import Terminal

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

要打印彩色砖块,最可靠的方法是使用背景颜色打印空间。我使用这种技术在 nose-progressive 中绘制进度条:

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 色终端。它还可以将不可读的转义序列排除在您的代码之外,同时保持简洁易用。玩得开心!

将颜色作为函数名称而不是参数是有问题的做法。

@LtWorf:如果需要,您可以使用 getattr 轻松地将其设为参数。或者更有可能,只是动态地创建格式字符串。

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

您 can just pass 是一个 python 函数。

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

答11:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

我使用 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'

原文链接:https://www.huntsbot.com/qa/6Lld/how-do-i-print-colored-text-to-the-terminal?lang=zh_CN&from=csdn

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值