Colorama是Python的一个库,但在Windows上可能无法返回带颜色的打印行。

29

我已经为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

这不是我预期的结果。我做错了什么吗?

谢谢。


1
你在运行什么操作系统? - user849425
我正在运行 64 位的 Windows 7 操作系统.... - Mike
3
你是在命令提示符下运行还是在某个IDE中运行?它应该可以在命令提示符下运行,但例如在IDLE或Eclipse Pydev中可能无法正常工作。 - Junuxx
你的代码在我的电脑上运行良好:Win 7 x64,Python 2.7.6 x64,colorama 0.3.1。 - alexandrul
没问题,应该可以。在我的 cmd 和 Cygwin 上都能运行。(Windows 10,Python35) - user3917838
11个回答

51

我在Windows 7 x64上也遇到了同样的问题,最终通过在init调用中添加参数convert=True,无需安装任何新软件就解决了颜色显示问题。

from colorama import init, Fore, Back, Style

init(convert=True)

print(Fore.RED + 'some red text')

2
我在Windows 10上使用它,但它不起作用。它没有显示颜色。 - Ringo
1
我在Windows 10上使用它,在我的情况下它可以工作,但是当从cmd运行Python时... - Chadee Fouad
嘿,我知道这个方法,但它并不总是有效。比如,在函数内部突然停止打印彩色文本。此外,即使我在函数内添加init(convert=True)参数或其他任何东西,它也不起作用。对我来说,它只能在代码的前100行中工作。我不知道为什么。也许如果有人能帮忙就好了 :) 编辑:虽然我晚了,但我会很感激,因为这是我几个月以来一直面临的问题! - The Myth

7

我从未成功地在Windows cmd.exe中使用颜色而不需要使用colorama等工具。 在打了Ansicon补丁后,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://dev59.com/OG445IYBdhLWcg3wq8Lp#4749307

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


ansicon -i 可以让它在所有cmd.exe命令行窗口上工作。然而,Python命令行 shell 仍无法解释转义序列。\x1b 在有效的ANSI序列前仍显示为左指向箭头。我还需要做些什么吗? - Old Geezer

5

我意识到这是一个非常老旧的问题,但是现有的答案都没有帮助到我,所以我要发布我的解决方案,以防其他人也遇到同样的问题。在我的情况下,问题在于我导入了来自sysstdout,然后初始化了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.stdout和sys.stderr与代理对象一起工作,这些代理对象重写.write()方法以执行它们的工作。
因此,在调用init的过程中,我需要在其被替换后导入stdout。
>>> 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上正常工作了! - raphael

4
我知道我来晚了,但这将有望帮助仍在寻找答案的任何人。
PyPI上的Colorama文档开始:

Colorama can be used happily in conjunction with existing ANSI libraries such as 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)为我解决了问题。

3

打印前清除命令提示符

import os
from colorama import init,Fore
init()
os.system("cls" or "clear")

print Fore.RED + "My Text is Red"

请问您能否添加一段成功运行的代码,并附上相应的解释?看起来您正在使用Colorama中的“Fore”,但是没有导入它。 - Aditya Patnaik

1

我知道这是一个旧帖子,但我会回答任何新来的人。对我而言,基本上有效的方法是在打印彩色文本之前放置控制台清除命令。

例如,不要这样做:

#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的问题。)


1

添加

colorama.init()

或者

from colorama import init
init()

回到你的代码,它就会正常工作。


1

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

尝试使用tendo.colorer之类的东西,这将使所有平台都能够进行着色。

注意:tendo.colorer会向日志添加颜色,但我相信你会想出如何将其用于其他事情。如果我没记错的话,在你的代码之前导入它就可以解决问题了。


1
你没有理解重点。OP明确表示他已经拥有colorama库。 - Junuxx
@Junuxx,也许是这样,但如果OP想要做的事情不起作用,应该提出替代方案。我在Windows上遇到了colorama无法工作的问题。tendo.colorer模块对我有用。尽管URL现在是https://github.com/pycontribs/tendo/blob/master/tendo/colorer.py。 - Brad Campbell

0

只需将此粘贴到导入的末尾即可,Ez

init(convert=True)
os.system("mode 360")
os.system("cls")

嗨,感谢您的回答。如果您能解释一下为什么以及如何解决OP的问题,那将对我们的读者非常有帮助。 - Simas Joneliunas

-3

你只能使用一个import导入,例如:

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接