Skip to main content

跨平台彩色终端文本。

项目描述

最新版本 支持的 Python 版本 构建状态

色拉马

使 ANSI 转义字符序列(用于生成彩色终端文本和光标定位)在 MS Windows 下工作。

用于发布的 PyPI | Github 获取源代码| Tidelift 上的企业用 Colorama

如果您发现 Colorama 有用,请用贝宝捐款向作者提出。谢谢!

安装

在 CPython 2.7、3.5、3.6、3.7、3.8、3.9 和 3.10 以及 Pypy 2.7 和 3.6 上进行了测试。

除了标准库之外没有其他要求。

pip install colorama
# or
conda install -c anaconda colorama

描述

ANSI 转义字符序列长期以来一直用于在 Unix 和 Mac 上生成彩色终端文本和光标定位。Colorama 通过包装stdout、剥离它找到的 ANSI 序列(在输出中将显示为 gobbledygook )并将它们转换为适当的 win32 调用以修改终端的状态,也使这项工作在 Windows 上工作。在其他平台上,Colorama 什么都不做。

这样做的结果是提供了一个简单的跨平台 API,用于从 Python 打印彩色终端文本,并且具有令人愉快的副作用,即使用 ANSI 序列在 Linux 或 Mac 上生成彩色输出的现有应用程序或库现在也可以在 Windows 上运行,只需调用 colorama.init()即可。

另一种方法是在 Windows 机器上安装ansi.sys,它为在终端中运行的所有应用程序提供相同的行为。Colorama 适用于不容易实现的情况(例如,您的应用可能没有安装程序。)

源代码存储库中的演示脚本使用 ANSI 序列打印一些彩色文本。比较它们在 Gnome 终端的内置 ANSI 处理下的输出,与在 Windows 命令提示符下使用 Colorama 的输出:

在 gnome-terminal 下的 Ubuntu 上的 ANSI 序列。 Windows 上相同的 ANSI 序列,使用 Colorama。

这些屏幕截图显示,在 Windows 上,Colorama 不支持 ANSI 'dim text';它看起来与“普通文本”相同。

用法

初始化

应用程序应使用以下方法初始化 Colorama:

from colorama import init
init()

在 Windows 上,调用init()将从发送到stdoutstderr的任何文本中过滤掉 ANSI 转义序列,并将它们替换为等效的 Win32 调用。

在其他平台上,调用init()无效(除非您请求其他可选功能,请参阅下面的“初始化关键字参数”;或者如果输出被重定向)。按照设计,这允许应用程序在所有平台上无条件地调用init() ,之后 ANSI 输出应该正常工作。

在所有平台上,如果输出被重定向,ANSI 转义序列将被完全去除。

要在程序退出之前停止使用 Colorama,只需调用deinit()即可。这会将stdoutstderr恢复为其原始值,从而禁用 Colorama。要再次使用 Colorama,请调用reinit();它比再次调用init()便宜(但做同样的事情)。

彩色输出

然后可以使用 Colorama 的 ANSI 转义序列的常量简写来完成彩色文本的跨平台打印。这些是刻意的初级,见下文。

from colorama import Fore, Back, Style
print(Fore.RED + 'some red text')
print(Back.GREEN + 'and with a green background')
print(Style.DIM + 'and in dim text')
print(Style.RESET_ALL)
print('back to normal now')

…或者简单地从您自己的代码中手动打印 ANSI 序列:

print('\033[31m' + 'some red text')
print('\033[39m') # and reset to default color

…或者,Colorama 可以与现有的 ANSI 库结合使用,例如古老的Termcolor 、神话般的Blessings或令人难以置信的_Rich

如果您希望 Colorama 的 Fore、Back 和 Style 常量功能更强大,请考虑使用上述功能强大的库之一来生成颜色等,并仅将 Colorama 用于其主要目的:将这些 ANSI 序列转换为也适用于 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'))

可用的格式常量有:

Fore: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET.
Back: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET.
Style: DIM, NORMAL, BRIGHT, RESET_ALL

Style.RESET_ALL重置前景、背景和亮度。Colorama 将在程序退出时自动执行此重置。

这些得到了很好的支持,但不是标准的一部分:

Fore: LIGHTBLACK_EX, LIGHTRED_EX, LIGHTGREEN_EX, LIGHTYELLOW_EX, LIGHTBLUE_EX, LIGHTMAGENTA_EX, LIGHTCYAN_EX, LIGHTWHITE_EX
Back: LIGHTBLACK_EX, LIGHTRED_EX, LIGHTGREEN_EX, LIGHTYELLOW_EX, LIGHTBLUE_EX, LIGHTMAGENTA_EX, LIGHTCYAN_EX, LIGHTWHITE_EX

光标定位

支持重新定位光标的 ANSI 代码。有关如何生成它们的示例,请参见demos/demo06.py 。

初始化关键字参数

init()接受一些**kwargs来覆盖默认行为。

初始化(自动重置=假):

如果您发现自己在每次打印结束时重复发送重置序列以关闭颜色更改,那么init(autoreset=True)将自动执行以下操作:

from colorama import init
init(autoreset=True)
print(Fore.RED + 'some red text')
print('automatically back to default color again')
初始化(条=无):

传递TrueFalse以覆盖是否应从输出中去除 ANSI 代码。如果在 Windows 上或输出被重定向(不是 tty),默认行为是剥离。

初始化(转换=无):

传递TrueFalse以覆盖是否将输出中的 ANSI 代码转换为 win32 调用。默认行为是在 Windows 上转换 if 并且输出到 tty(终端)。

初始化(包装=真):

在 Windows 上,Colorama 通过将sys.stdoutsys.stderr替换 为代理对象来工作,这些代理对象会覆盖.write()方法来完成它们的工作。如果这种包装给你带来了问题,那么可以通过传递 init(wrap=False)来禁用它。如果autoresetstripconvert为 True ,则默认行为是换行。

禁用环绕后,非 Windows 平台上的彩色打印将继续正常工作。要进行跨平台彩色输出,可以直接使用 Colorama 的AnsiToWin32代理:

import sys
from colorama import init, AnsiToWin32
init(wrap=False)
stream = AnsiToWin32(sys.stderr).stream

# Python 2
print >>stream, Fore.BLUE + 'blue text on stderr'

# Python 3
print(Fore.BLUE + 'blue text on stderr', file=stream)

公认的 ANSI 序列

ANSI 序列通常采用以下形式:

ESC [ <param> ; <param> ... <command>

其中<param>是一个整数,而<command>是一个字母。零个或多个参数传递给<command>。如果未传递任何参数,则通常与传递单个零同义。序列中不存在空格;它们被插入这里只是为了更容易阅读。

Colorama 转换为 win32 调用的唯一 ANSI 序列是:

ESC [ 0 m       # reset all (colors and brightness)
ESC [ 1 m       # bright
ESC [ 2 m       # dim (looks same as normal brightness)
ESC [ 22 m      # normal brightness

# FOREGROUND:
ESC [ 30 m      # black
ESC [ 31 m      # red
ESC [ 32 m      # green
ESC [ 33 m      # yellow
ESC [ 34 m      # blue
ESC [ 35 m      # magenta
ESC [ 36 m      # cyan
ESC [ 37 m      # white
ESC [ 39 m      # reset

# BACKGROUND
ESC [ 40 m      # black
ESC [ 41 m      # red
ESC [ 42 m      # green
ESC [ 43 m      # yellow
ESC [ 44 m      # blue
ESC [ 45 m      # magenta
ESC [ 46 m      # cyan
ESC [ 47 m      # white
ESC [ 49 m      # reset

# cursor positioning
ESC [ y;x H     # position cursor at x across, y down
ESC [ y;x f     # position cursor at x across, y down
ESC [ n A       # move cursor n lines up
ESC [ n B       # move cursor n lines down
ESC [ n C       # move cursor n characters forward
ESC [ n D       # move cursor n characters backward

# clear the screen
ESC [ mode J    # clear the screen

# clear the line
ESC [ mode K    # clear the line

'm'命令的多个数字参数可以组合成一个序列:

ESC [ 36 ; 45 ; 1 m     # bright cyan text on magenta background

ESC [ <param> ;形式的所有其他 ANSI 序列 <param> ... <command> 在 Windows 的输出中被默默地删除。

任何其他形式的 ANSI 序列,例如单字符代码或替代初始字符,都不会被识别或去除。不过添加它们会很酷。通过 GitHub 上的问题让我知道它是否对您有用。

状态和已知问题

我个人只在 Windows XP(CMD、Console2)、Ubuntu(gnome-terminal、xterm)和 OS X 上测试过它。

一些可能有效的 ANSI 序列无法识别(请参阅下面的详细信息),但据我所知,还没有人抱怨过这一点。令人费解。

查看未决问题和愿望清单: https ://github.com/tartley/colorama/issues

如果有什么对您不起作用,或者没有达到您的预期或希望,我很乐意在该问题列表中听到它,对补丁感到高兴,并且很乐意向任何人授予提交访问权限谁提交一两个工作补丁。

如果您正在修改代码,请参阅README-hacking.md

执照

版权所有 Jonathan Hartley 和 Arnon Yaari,2013-2020。BSD 3 条款许可证;请参阅许可证文件。

专业支持

潮汐升降机

作为 Tidelift 订阅的一部分,提供对 colorama 的专业支持。Tidelift 为软件开发团队提供了购买和维护软件的单一来源,由最了解它的专家提供专业等级保证,同时与现有工具无缝集成。

谢谢

  • 用于 Python2.5 的setup.py修复的Marc Schlaich (schlamar) 。

  • Marc Abramowitz,报告并修复了关闭stdout的退出崩溃,为问题 #7 的 setuptools/distutils 辩论和其他修复提供了解决方案。

  • 用户 'eryksun',获取有关正确实例化ctypes.windll的指导。

  • Matthew McCormick 礼貌地指出了非 Win 的长期崩溃。

  • Ben Hoyt,在 64 位 Windows 下进行了出色的修复。

  • Empty Square 的 Jesse 提交了 README 中示例的修复。

  • 用户'jamessp',一个用于光标定位的观察性文档修复。

  • 用户 'vaal1239'、Dave Mckee 和 Lackner Kristof 提供了一个微小但急需的 Win7 修复程序。

  • Julien Stuyck,明智地建议对 README 进行兼容 Python3 的更新。

  • 丹尼尔·格里菲斯(Daniel Griffith)的多个精彩补丁。

  • Oscar Lesta 提供了一个有价值的修复,以阻止将 ANSI 字符发送到非 tty 输出。

  • Roger Binns,提供许多建议、宝贵的反馈和错误报告。

  • 提姆·戈尔登(Tim Golden)深思熟虑,并非常感谢对最初想法的反馈。

  • 用户“Zearin”更新自述文件。

  • John Szakmeister 添加了对浅色的支持

  • Charles Merriam 为演示添加文档

  • Jurko 修复了 64 位 Windows CPython2.5 w/o ctypes

  • 当 stdout 或 stderr 为 None 时,Florian Bruhin 进行修复

  • Thomas Weininger 在 Windows 上修复 ValueError

  • Remi Rampin 用于更好地集成 Github 并修复 README 文件

  • Simeon Visser 用于使用“with”关闭文件句柄并更新分类器以包含 Python 3.3 和 3.4

  • Andy Neff 用于修复 LIGHT_EX 颜色的 RESET。

  • 乔纳森哈特利最初的想法和实施。

项目详情