【问题标题】:Python: How can I make the ANSI escape codes to work also in Windows?Python:如何使 ANSI 转义码在 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 上也能工作?

【问题讨论】:

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

标签: python windows ansi-escape


【解决方案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[31m{message}\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"])
          

          【讨论】:

          • 此答案只是对已接受答案的轻微修改,您应该建议此修改而不是添加新答案。谢谢!
          猜你喜欢
          • 2013-03-15
          • 1970-01-01
          • 1970-01-01
          • 2014-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多