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

Python:如何使ANSI转义码也在Windows中工作?,python,windows,python-2.7,ansi-escape,Python,Windows,Python 2.7,Ansi Escape,如果我在linux下用python运行它,它会工作: start=“\033[1;31m” end=“\033[0;0m” 打印“文件为:“+开始+”+结束 但是如果我在Windows中运行它,它就不起作用了,我怎样才能使ANSI转义码在Windows上也起作用呢?你可以看看 自述文件: >>> from clint.textui import colored, puts >>> puts(colored.red('red text')) red tex

如果我在linux下用python运行它,它会工作:

start=“\033[1;31m”
end=“\033[0;0m”
打印“文件为:“+开始+”+结束
但是如果我在Windows中运行它,它就不起作用了,我怎样才能使ANSI转义码在Windows上也起作用呢?

你可以看看

自述文件:

>>> from clint.textui import colored, puts

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

# It's red in Windows, OSX, and Linux alike.
你可以看看它是否有用

该模块似乎是跨平台的

您要安装colorama:

pip install colorama
然后:

import colorama
colorama.init()
start = "\033[1;31m"
end = "\033[0;0m"
print "File is: " + start + "<placeholder>" + end
import colorama
colorama.init()
start=“\033[1;31米”
end=“\033[0;0m”
打印“文件为:“+开始+”+结束

我编写了一个简单的模块,可从以下网址获得:

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

文件可在此处找到:

PS:对于,这是相同的答案,但我不知道如何链接到回复。

如果您使用Win 10(cmd中的本机ANSI支持),则似乎有一个问题(尽管看起来没有问题,但实际上已修复)


一种解决方法是在打印之前添加
子流程。call(“”,shell=True)

尝试在此处添加分号
\033[;
,如果没有分号,会产生不良效果

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

根据互联网上成千上万的优秀答案,发送ANSI转义序列应该是可行的,但我花了两天半的时间才发现了一个模糊的细节。诀窍是必须设置某个注册表项。我正在使用(就今天而言)Windows 10 Enterprise,版本1709,版本16299

在HKEY_CURRENT_USER中,在Console下,在TrimLeadingZero和WindowAlpha之间应该有VirtualTerminalLevel。如果它不存在,请继续创建它。它是一个REG_DWORD。将其值设置为1。打开一个新终端,运行Python,并享受一点乐趣

print("\033[48;2;255;140;60m ORANGE BACKGROUND \033[48;2;0;0;0m")
看看那些比我知道得更多的人的文章


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

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

导入操作系统
如果os.name='nt':#仅当我们在Windows上运行时
从ctypes导入Windell
k=windell.kernel32
k、 SetConsoleMode(k.GetStdHandle(-11),7)
完成此操作后,您可以使用ASCII特殊字符(如红色的
\x1b[31m
),就好像您在Unix操作系统上一样:

message=“错误”
打印(f“\x1b[31m{message}\x1b[0m”)

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

对于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"])
您可以这样做:

import os
os.system("")

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

看看是否有用当“\33”是同一个东西时,为什么要使用“\033”?@Apostolos它们是一样的,但我使用“\033”是出于bash的习惯。此外,在许多语言中,对于八进制来说\0和以0开头是显式的,是描述性的,如果我使用一些我想要标准库附带的东西。你仍然可以看看源代码。在幕后它使用colarama,它基本上包装了sys.stdout.write来替换转义序列。在标准库可以完成某些操作时安装特殊模块…糟糕的解决方案!它与colorama一起工作我编辑了answer包含完整的代码。当“\33”是同一个东西时,为什么要使用“\033”?@Apostolos Escape是代码27,我认为\033是八进制的,并转换为27。我可以确认这个解决方法工作得很好,但你知道它为什么工作吗?@Joost不记得了,但我想有一些解释。另一个(较短的)解决方法是
os.system(“”)
,我想它在内部也确实如此!这是程序员应该思考的正确、有效的方式!(当问题可以通过内置模块解决时,使用额外软件包来解决问题的人数真是惊人!)回答不错,因为它不需要安装新模块。您不需要调用颜色。默认情况下,命令提示符支持颜色,因此您可以只执行操作系统(“”)(至少对我来说是这样)谢谢你提供的信息,我刚刚测试过,它也适用于我。谢谢!其他人:我刚刚将该代码添加到python文件的顶部,并且我能够在windows中使用这些ANSI或ESC代码。此答案只是对已接受答案的一个轻微编辑,你应该建议进行此编辑,而不是添加新答案。谢谢!
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"])
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"])