Python:如何使ANSI转义码在Windows中也能正常工作?

时间:2012-09-19 10:23:46

标签: python windows python-2.7 ansi-escape

如果我在linux下的python中运行它,它可以工作:

start = "\033[1;31m"
end = "\033[0;0m"
print "File is: " + start + "<placeholder>" + end

但是如果我在Windows中运行它不起作用,我怎样才能使ANSI转义码在Windows上运行?

11 个答案:

答案 0 :(得分:15)

您可以查看Python module to enable ANSI colors for stdout on Windows?以查看它是否有用。

colorama模块似乎是跨平台的。

您安装了colorama:

pip install colorama

然后:

import colorama
colorama.init()
start = "\033[1;31m"
end = "\033[0;0m"
print "File is: " + start + "<placeholder>" + end

答案 1 :(得分:8)

这是我长期以来寻求的解决方案。只需使用标准库中的ctypes模块。默认情况下,它在Windows上使用Python 3.x安装,仅 。因此,在使用该操作系统之前,请先检查该操作系统是否为Windows(例如,使用platform.system)。

from platform import system
if "win" in system().lower(): # works for Win7, 8, 10 ...
    from ctypes import windll
    k = windll.kernel32
    k.SetConsoleMode(k.GetStdHandle(-11), 7)

完成此操作后,就可以像使用Unix操作系统一样使用ASCII特殊字符(例如\x1b[31m,代表红色):

message = "ERROR"
print(f"\x1b[31m{message}\x1b[0m")

我喜欢此解决方案,因为它不需要安装模块(例如colorama或termcolor)。

答案 2 :(得分:4)

您可以查看https://github.com/kennethreitz/clint

自述文件:

>>> from clint.textui import colored, puts

>>> puts(colored.red('red text'))
red text

# It's red in Windows, OSX, and Linux alike.

答案 3 :(得分:4)

对于Windows,调用os.system(“ color”)可以正确处理ANSI转义序列:

import os
os.system("color")

COLOR = {
    "HEADER": "\033[95m",
    "BLUE": "\033[94m",
    "GREEN": "\033[92m",
    "RED": "\033[91m",
    "ENDC": "\033[0m",
}

print(COLOR["GREEN"], "Testing Green!!", COLOR["ENDC"])

答案 4 :(得分:2)

如果您使用的是Win 10(在cmd中具有本机ANSI支持),则似乎有一个bug which was marked as resolvedin Python 3.7(尽管它看起来实际上不是固定的)。

一种解决方法是在打印之前添加subprocess.call('', shell=True)

答案 5 :(得分:2)

尝试在此处\033[;添加分号,如果没有该分号,我会得到不良效果。

start = "\033[;1;31m"
end = "\033[;0;0m"

答案 6 :(得分:1)

我写了一个简单的模块,可在以下网址找到:http://pypi.python.org/pypi/colorconsole

适用于Windows,Mac OS X和Linux。它使用ANSI for Linux和Mac,但在Windows上本机调用控制台功能。你有颜色,光标定位和键盘输入。它不是curses的替代品,但如果你需要在简单的脚本或ASCII游戏中使用,它会非常有用。

可在此处找到文档:http://code.google.com/p/colorconsole/wiki/PageName

PS:这是Print in terminal with colors using Python?的答案,但我不知道如何链接到答复。

答案 7 :(得分:1)

您可以这样做:

import os
os.system("")

这对我有用。默认情况下,命令提示符不支持颜色。

答案 8 :(得分:1)

这是我使用过的更简单的代码。

Any

答案 9 :(得分:0)

根据互联网上成千上万个好的答案,发送ANSI转义序列应该可以工作,但是一个晦涩的细节花了我半天的时间才发现。诀窍是必须设置某个注册表项。我正在使用(仅适用于今天)Windows 10 Enterprise,版本1709,内部版本16299。

在HKEY_CURRENT_USER中,在控制台下的TrimLeadingZeros和WindowAlpha之间,应该有VirtualTerminalLevel。如果不存在,请继续创建它。这是REG_DWORD。将其值设置为1。打开一个新的终端,运行Python,然后开始玩。

print("\033[48;2;255;140;60m ORANGE BACKGROUND \033[48;2;0;0;0m")

请参阅https://github.com/ytdl-org/youtube-dl/issues/15758,以由比我了解更多的人来阅读。

现在,如果我还记得为什么,我想给Python程序的输出着色...

答案 10 :(得分:0)

import os
os.system("")

COR = {
    "HEADER": "\033[95m",
    "BLUE": "\033[94m",
    "GREEN": "\033[92m",
    "RED": "\033[91m",
    "ENDC": "\033[0m",
}

print(COR["RED"]+"Testing Green!!"+COR["ENDC"])