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

Posted

技术标签:

【中文标题】Python:如何使 ANSI 转义码在 Windows 中也能正常工作?【英文标题】:Python: How can I make the ANSI escape codes to work also in Windows? 【发布时间】:2012-09-11 15:35:39 【问题描述】:

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

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

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

【问题讨论】:

看看***.com/questions/8358533/…如果有用的话 为什么在 '\33' 是同一个东西的情况下使用 '\033'? @Apostolos 它们是相同的,但由于 bash,我习惯使用 '\033'。在许多语言中,\0 和以 0 开头的八进制都是显式的,具有描述性,不会造成混淆 【参考方案1】:

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

import os
os.system("")  # enables ansi escape characters in terminal

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


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

【讨论】:

不错的答案,因为它不需要安装新模块 你不需要调用颜色。命令提示符默认支持颜色,所以你可以做os.system("")(至少对我来说) 感谢您的信息,我刚刚测试过,它也适用于我。 os.system("color")os.system("") 更明确。想想看,阅读代码的人对后者的预期是多么少。【参考方案2】:

您可以查看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

【讨论】:

它适用于 colorama 我编辑了答案以包含完整的代码。 为什么在 '\33' 是同一个东西的情况下使用 '\033'? @Apostolos Escape 是代码 27 我认为 \033 是八进制并转换为 27 使用像 colorama 这样的库是一个很好的解决方案,但是示例代码并没有显示如何正确使用这个库..【参考方案3】:

这是我长期寻求的解决方案。只需使用标准库中的ctypes 模块。它默认与 Python 3.x 一起安装,only 在 Windows 上。所以在使用它之前检查操作系统是否是Windows(例如platform.system)。

import os
if os.name == 'nt': # Only if we are running on Windows
    from ctypes import windll
    k = windll.kernel32
    k.SetConsoleMode(k.GetStdHandle(-11), 7)

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

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

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

【讨论】:

没错!这是程序员应该思考的正确、有效的方式! (当使用内置模块解决问题时,使用额外包解决问题的人数令人惊讶!) 谢谢先生,这正是我正在寻找的解决方案,在这里,有一个upvote 这必须是答案【参考方案4】:

如果您使用的是 Win 10(在 cmd 中支持本机 ANSI),似乎有一个 bug which was marked as resolved in Python 3.7(尽管它看起来并没有实际修复)。

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

【讨论】:

我可以确认该解决方法非常有效,但您知道它为什么有效吗? @Joost 不记得了,但我认为bugs.python.org/issue30075 有一些解释。 另一个(更短的)解决方法是os.system(''),我猜它在内部也是如此【参考方案5】:

你可以看看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.

【讨论】:

如果我要使用标准库附带的东西。 您仍然可以查看源代码。在幕后它使用 colarama,它基本上包装了 sys.stdout.write 以替换转义序列。 在标准库可以完成某些事情时安装特殊模块......糟糕的解决方案! @Apostolos 相反!模块的存在是有原因的。通常有很多坑会导致您的代码无法在某些系统上运行。通过使用经过良好测试和使用的代码,您可以获得更高的代码工作确定性。一个好的软件开发者不应该为每个项目重新发明*** 我不知道陷阱...我不记得任何情况下内置模块没有按应有的方式工作,但可能有。如果一个内置模块不能按你的意愿工作,那么只有你可以寻找一个外部模块作为替代,这就是简单的逻辑。【参考方案6】:

你可以这样做:

import os
os.system("")

这对我有用。命令提示符默认支持颜色。

【讨论】:

谢谢!对于其他人:我刚刚将该代码添加到我的 python 文件的顶部,并且能够在 Windows 中使用这些 ANSI 或 ESC 代码。【参考方案7】:

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

在 HKEY_CURRENT_USER 中,在 Console 下,在 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 程序的输出着色...

【讨论】:

【参考方案8】:

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

import os
os.system("color") # Alternative - os.system("")

TCOLOR = "\033[31;3m"
ENDC = "\033[m"
print (TCOLOR + "Make yourself happy" + ENDC)

【讨论】:

【参考方案9】:

我写了一个简单的模块,可在:http://pypi.python.org/pypi/colorconsole

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

文档可以在这里找到:http://code.google.com/p/colorconsole/wiki/PageName

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

【讨论】:

【参考方案10】:

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

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

【讨论】:

【参考方案11】:
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"])

【讨论】:

此答案只是对已接受答案的轻微修改,您应该建议此修改而不是添加新答案。谢谢!

以上是关于Python:如何使 ANSI 转义码在 Windows 中也能正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Windows 10控制台中使用ANSI转义序列的新支持?

读取线被ANSI转义序列混淆

如何让 win32 控制台识别 ANSI/VT100 转义序列?

如何在 Windows 10 控制台中使用对 ANSI 转义序列的新支持?

为啥ANSI颜色转义码不起作用[重复]

ANSI 颜色转义序列列表