跳转到主要内容

跨平台彩色终端文本。

项目描述

Latest Version Supported Python versions Build Status

Colorama

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

PyPI发布 | Github源码 | Colorama在Tidelift的企业版

如果您觉得Colorama很有用,请通过通过Paypal捐赠向作者捐赠。谢谢!

安装

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

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

pip install colorama
# or
conda install -c anaconda colorama

描述

ANSI转义字符序列长期以来一直被用于在Unix和Mac上产生彩色终端文本和光标定位。Colorama通过包装stdout,移除其发现的ANSI序列(这些序列在输出中会显示为乱码),并将它们转换为适当的win32调用以修改终端状态,使这项工作在Windows上也能实现。在其他平台上,Colorama不执行任何操作。

这提供了从Python打印彩色终端文本的简单跨平台API,并且有一个令人高兴的副作用,即现有应用程序或库现在可以在Windows上工作,只需调用colorama.just_fix_windows_console()(自v0.4.6起)或colorama.init()(所有版本,但可能具有其他副作用——见下文)即可。

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

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

ANSI sequences on Ubuntu under gnome-terminal. Same ANSI sequences on Windows, using Colorama.

这些截图显示,在Windows上,Colorama不支持ANSI“暗淡文本”,它看起来与“普通文本”相同。

用法

初始化

如果您只想从Colorama中获得使ANSI转义在Windows上工作,那么运行

from colorama import just_fix_windows_console
just_fix_windows_console()

如果您使用的是Windows 10的最新版本或更好版本,并且您的stdout/stderr指向Windows控制台,那么这将翻转魔法配置开关以启用Windows内置的ANSI支持。

如果您使用的是较旧的Windows版本,并且您的stdout/stderr指向Windows控制台,那么这将包装sys.stdout和/或sys.stderr在一个魔法文件对象中,该对象拦截ANSI转义序列并发出适当的Win32调用来模拟它们。

在其他所有情况下,它根本不做任何事情。基本上,这个想法是使Windows在ANSI转义处理方面表现得像Unix。

多次调用此函数是安全的。在非Windows平台上调用此函数是安全的,但它不会做任何事情。在您的stdout/stderr中之一或两者被重定向到文件时调用此函数是安全的——它不会对这些流做任何事情。

您还可以使用具有更多功能(但也更容易出现错误)的较老接口

from colorama import init
init()

这与just_fix_windows_console做同样的事情,但有以下不同之处

  • 多次调用init是不安全的;您可能会得到多层包装和损坏的ANSI支持。

  • Colorama将应用启发式方法来猜测stdout/stderr是否支持ANSI,如果它认为不支持,那么它将在打印它们之前将sys.stdoutsys.stderr包装在一个魔法文件对象中,该对象会移除ANSI转义序列。这在所有平台上都会发生,如果您希望无条件地编写发出ANSI转义序列的代码,并且让Colorama决定是否应该实际输出它们,这可能会很方便。但请注意,Colorama的启发式方法并不特别聪明。

  • init 还接受显式的关键字参数来启用/禁用各种功能 - 见下文。

要在程序退出之前停止使用 Colorama,只需调用 deinit()。这将恢复 stdoutstderr 的原始值,因此 Colorama 被禁用。要重新开始使用 Colorama,调用 reinit();它比再次调用 init() 更经济(但做的是同样的事情)。

大多数用户应依赖 colorama >= 0.4.6,并使用 just_fix_windows_console。旧 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 上也能工作

类似地,不要向 Colorama 发送添加生成新 ANSI 类型的 PR。我们只对将 ANSI 代码转换为 win32 API 调用感兴趣,而不是像上面那样的生成 ANSI 字符的快捷方式。

from colorama import just_fix_windows_console
from termcolor import colored

# use Colorama to make Termcolor work on Windows too
just_fix_windows_console()

# 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 关键字参数

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

init(autoreset=False)

如果您发现自己反复发送重置序列来在每个打印的末尾关闭颜色变化,那么 init(autoreset=True) 将自动化此过程

from colorama import init
init(autoreset=True)
print(Fore.RED + 'some red text')
print('automatically back to default color again')
init(strip=None)

传递 TrueFalse 以覆盖是否应从输出中删除 ANSI 代码。默认行为是在 Windows 上或输出被重定向(非 tty)时删除。

init(convert=None)

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

init(wrap=True)

在 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>是单个字母。可以将零个或多个params传递给<command>。如果没有传递params,通常等同于传递单个零。序列中没有空格;这里简单地插入以方便阅读。

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”命令的多个数字params可以合并成一个序列

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

Windows上其他形式的ANSI序列(如ESC [ <param> ; <param> ... <command>)都会在输出中静默删除。

其他形式的ANSI序列(如单字符代码或替代初始字符)不被识别或删除。不过,添加它们会很好。如果您认为这有用,请通过GitHub上的问题反馈给我。

状态 & 已知问题

我只在Windows XP(CMD,Console2)、Ubuntu(gnome-terminal,xterm)和OS X上亲自测试过。

一些有效的ANSI序列没有被识别。

如果您正在修改代码,请参阅README-hacking.md。特别是,请参阅那里的解释,说明我们为什么不想接受允许Colorama生成新类型ANSI代码的PR。

查看未解决的问题和愿望列表:https://github.com/tartley/colorama/issues

如果您遇到任何问题,或者它没有按照您期望或希望的方式工作,我很乐意在问题列表中了解它,我将很高兴收到补丁,并愿意授予任何提交一个或多个有效补丁的人提交权限。

许可证

版权所有:Jonathan Hartley & Arnon Yaari,2013-2020。BSD 3-Clause许可;请参阅LICENSE文件。

专业支持

Tidelift

colorama的专业支持作为Tidelift订阅的一部分提供。Tidelift为软件开发团队提供了一个购买和维护其软件的单一点,同时从最了解它的专家那里获得专业级的保证,并与现有工具无缝集成。

感谢

更多信息请参阅CHANGELOG。

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

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

  • 用户“eryksun”,关于正确实例化ctypes.windll的指导。

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

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

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

  • 用户“jamessp”,对光标定位的观察性文档修复。

  • 用户“vaal1239”,Dave Mckee和Lackner Kristof,一个微小但非常需要的Win7修复。

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

  • Daniel Griffith,提交了多个出色的补丁。

  • Oscar Lesta,防止ANSI字符发送到非tty输出的有用修复。

  • Roger Binns,提出了许多建议,有价值的反馈和错误报告。

  • Tim Golden,对初始想法进行了思考和高度赞赏的反馈。

  • 用户“Zearin”,对README文件的更新。

  • John Szakmeister,添加了对浅色支持。

  • Charles Merriam,添加了演示文档。

  • Jurko,在64位Windows CPython2.5 w/o ctypes上的修复。

  • Florian Bruhin,当stdout或stderr为None时的修复。

  • Thomas Weininger,修复了Windows上的ValueError。

  • Remi Rampin,改进了GitHub集成和对README文件的修复。

  • Simeon Visser,使用‘with’关闭文件句柄,并更新分类器以包括Python 3.3和3.4。

  • Andy Neff,修复了LIGHT_EX颜色的RESET。

  • Jonathan Hartley 提出初始想法和实现。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源代码分发

colorama-0.4.6.tar.gz (27.7 kB 查看哈希值)

上传时间 源代码

构建分发

colorama-0.4.6-py2.py3-none-any.whl (25.3 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面