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转义序列的新支持?
如何让 win32 控制台识别 ANSI/VT100 转义序列?