【问题标题】:Colorama for Python, Not returning colored print lines on Windows用于 Python 的 Colorama,在 Windows 上不返回彩色打印线
【发布时间】:2012-04-08 14:02:22
【问题描述】:

我已经为 python 安装了 colorama。我已按如下方式导入模块:

import colorama
from colorama import init
init()
from colorama import Fore, Back, Style

print Fore.RED + "My Text is Red"

它返回 ANSI 字符....

esc[31mMy Text is Red

这不是我所期望的。我是不是做错了什么。

谢谢。

【问题讨论】:

  • 你在什么操作系统上运行这个?
  • 我正在运行 Windows 7 64 位......
  • 您是在命令提示符下运行它,还是在某些 IDE 中运行它?例如,它应该在命令提示符下工作,但不能在 IDLE 或 Eclipse Pydev 中工作。
  • 您的代码在cmd.exe 中对我来说工作得很好:Win 7 x64,Python 2.7.6 x64,colorama 0.3.1
  • 是的,应该可以。在cmd 上,它对我和 Cygwin 都有效。 (Windows 10,Python35)

标签: python windows ansi


【解决方案1】:

这很正常,因为您在 Windows 上没有ANSI

尝试tendo.colorer 之类的东西,这将为所有平台启用着色。

注意:tendo.colorer 为原木添加了颜色,但我相信你会弄清楚如何将它用于其他用途。如果我没有弄错,只是在您的代码之前导入它,它将解决问题。

【讨论】:

  • 你没有抓住重点。 OP 明确声明他已经拥有colorama 库。
  • @Junuxx,也许是这样,但如果 OP 想要做的事情不起作用,则应提出替代方案。我遇到了 colorama 无法在 Windows 上运行的问题。该tendo.colorer 模块为我工作。虽然 URL 现在是 github.com/pycontribs/tendo/blob/master/tendo/colorer.py
【解决方案2】:

尝试以下方法:

import colorama

colorama.init()
print colorama.Fore.GREEN + " Hey, im green! "

【讨论】:

  • 这与问题中的示例没有什么不同,只是使用了表面上不同的导入语法。
  • 和问题一样。
【解决方案3】:

如果不使用 Ansicon 修补它,我从来没有成功让颜色在 Windows cmd.exe 中工作。修补后,ANSI 颜色代码将可以工作,而无需使用 colorama 之类的东西(这对我也不起作用)。

要使用 Ansicon 修补 cmd.exe,请执行以下操作:

  1. https://github.com/adoxa/ansicon/downloads 下载 Ansicon 并将其解压缩到没有空格的目录中
  2. 使用 cmd 提示符并导航到解压缩文件的位置。
  3. CD 放入 x64 目录(除非你有 32 位机器,然后使用 x86 的)
  4. 输入ansicon.exe –i
  5. 打开一个新的 cmd 提示符

通过:https://stackoverflow.com/a/4749307/191902

另外,如果您有 NVidia 显卡,您可能需要将环境变量“ANSICON_EXC”设置为“nvd3d9wrap.dll”。

【讨论】:

  • ansicon -i 使它适用于我所有的 cmd.exe shell。但是,Python 命令行 shell 仍然不会解释转义序列。有效 ANSI 序列前面的 \x1b 仍显示为左箭头。还有什么我必须做的吗?
【解决方案4】:

您可以只使用一次导入。如:

from colorama import init, Fore, Back, Style

init()

你现在可以试试:

print(Fore.RED + 'some red text')
print(Back.GREEN + 'and with a green background')
print(Style.DIM + 'and in dim text')
print(Fore.RESET + Back.RESET + Style.RESET_ALL)

【讨论】:

    【解决方案5】:

    我在 Windows 7 x64 上遇到了同样的问题,我终于可以通过在 init 调用中添加参数 convert=True 来使颜色正常工作,而无需安装任何新东西。

    from colorama import init, Fore, Back, Style
    
    init(convert=True)
    
    print(Fore.RED + 'some red text')
    

    【讨论】:

    • 我在 Windows 10 上使用它,但它不起作用。它不显示颜色
    • 我在 Windows 10 上使用它,它适用于我的情况,但是从 cmd 运行 python 时
    【解决方案6】:

    我知道我迟到了,但这希望对仍在寻找答案的人有所帮助。

    来自Colorama's documentation on PyPI

    Colorama 可以与现有的 ANSI 库(例如 Termcolor)一起愉快地使用

    from colorama import init
    from termcolor import colored
    
    # use Colorama to make Termcolor work on Windows too
    init()
    
    # then use Termcolor for all colored text output
    print(colored('Hello, World!', 'green', 'on_red'))
    

    这对我有用,在 Windows 10 64 位的 Anaconda Prompt(本质上是 cmd.exe)上。

    Colorama 的原生 ANSI 序列由于某种原因似乎无法正常工作。一个外部 ANSI 库(即 Termcolor)帮了我大忙。

    【讨论】:

      【解决方案7】:

      我意识到这是一个非常古老的问题,但现有的答案都没有帮助我,所以我发布我的解决方案以防其他人在同一条船上。就我而言,问题是我从sys 导入stdout,然后初始化colorama,这不起作用:

      >>> from colorama import Fore, Style, init
      >>> from sys import stdout
      >>> init()
      >>> stdout.write(Fore.RED + Style.BRIGHT + "Test" + Style.RESET_ALL + "\n")
      [31m[1mTest[0m
      

      根据https://pypi.org/project/colorama,这是因为:

      在 Windows 上,colorama 通过将 sys.stdoutsys.stderr 替换为代理对象来工作,这会覆盖 .write() 方法来完成它们的工作。

      因此,我需要导入 stdout 它已被替换为对 init 的调用的一部分:

      >>> from colorama import Fore, Style, init
      >>> init()
      >>> from sys import stdout
      >>> stdout.write(Fore.RED + Style.BRIGHT + "Test" + Style.RESET_ALL + "\n")
      Test      <--- This is now bright red.
      

      希望这会有所帮助!

      【讨论】:

      • 非常感谢您提供此信息!现在即使在 Windows 10 上也能正常工作!
      【解决方案8】:

      打印前清除cmd

      import os
      from colorama import init,Fore
      init()
      os.system("cls" or "clear")
      
      print Fore.RED + "My Text is Red"
      

      【讨论】:

      • 能否请您添加一个成功运行的代码并附上相同的解释?看来您正在使用 Colorama 的“Fore”而没有导入它。
      • 这行得通!谢谢。
      【解决方案9】:

      我知道这是一篇旧帖子,但我会为任何新来的人回答。几乎对我有用的是在打印我的彩色文本之前放置一个控制台清除命令。

      例如,不要这样做:

      #random code above
      def print_string():
          print(f'{Fore.YELLOW} Hello World {Fore.RESET}')
      

      这样做:

      #random code above
      def print_string():
          os.system('cls' if os.name == 'nt' else 'clear') # multi-platform clear statement
          print(f'{Fore.YELLOW} Hello World {Fore.RESET}')
      

      我不知道它是如何工作的,但在某些区域清除控制台似乎可以解决您的问题。我也有这个,一个朋友建议这样做,它奏效了。希望这会有所帮助。

      (这也解决了 ANSI 转义码以及 colorama 的问题。)

      【讨论】:

        【解决方案10】:

        添加

        colorama.init()
        

        或者

        from colorama import init
        init()
        

        你的代码,它会工作

        【讨论】:

          猜你喜欢
          • 2019-06-06
          • 2013-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-04
          • 1970-01-01
          • 2021-05-06
          相关资源
          最近更新 更多