为什么termcolor在Windows控制台中输出控制字符而不是彩色文本?

xzlaal3s  于 2023-06-24  发布在  Windows
关注(0)|答案(9)|浏览(269)

我刚刚在Windows上安装了termcolor for Python 2.7。当我尝试打印彩色文本时,我得到的是颜色代码。

from termcolor import colored
print colored('Text text text', 'red')

结果如下:

我在Far Manager上获得了相同的结果,当我尝试将脚本作为独立应用程序运行时也是如此。

8ehkhllq

8ehkhllq1#

要使termcolor中使用的ANSI颜色在windows终端中工作,还需要导入/init colorama;

>>> from termcolor import *
>>> cprint('hello', 'red')
←[31mhello←[0m
>>> import colorama
>>> colorama.init()
>>> cprint('hello', 'red')
hello                                    <-- in red color
>>>
yqhsw0fo

yqhsw0fo2#

windows命令提示符使用命令更改终端输出颜色。你可以执行命令“color color-code”来立即改变颜色。只需使用命令 color 即可激活此颜色功能。
简而言之..为了让你的脚本工作,在脚本的开头运行这个。

import os
os.system('color')
nkoocmlb

nkoocmlb3#

在termcolor2模块中,您必须键入以下内容:

import termcolor2
import colorama
colorama.init()

myText = input("Type a text : ")
color = input("What color you want? : ")

print(termcolor2.colored(myText, color))

就这样...

zbwhf8kr

zbwhf8kr4#

做了工作:

在导入termcolor之前插入:

import subprocess
subprocess.call('', shell=True)

没有工作:

1.导入colorama(没有)修复问题-仍然显示字符
1.导入/使用termcolor 2(没有)修复问题-仍然显示
人物
1.导入colorama AND termcolor 2 AND termcolor(didn 't)修复问题。
无法解释为什么它的工作,只有我能够比较一个脚本的颜色工作正确,一个没有工作正确。

v09wglhw

v09wglhw5#

一个非常简单的解决方案是创建一个定义颜色的类并在函数中使用它,您不必导入任何模块,只需复制并粘贴它:

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKCYAN = '\033[96m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'

def c_print(color, text):
    if color == "green":
        return print(bcolors.OKGREEN + text + bcolors.ENDC)
    if color == "cyan":
        return print(bcolors.OKCYAN + text + bcolors.ENDC)
    if color == "blue":
        return print(bcolors.OKBLUE + text + bcolors.ENDC)

line = f"{bcolors.OKCYAN}It will wish you on every start up{bcolors.ENDC}"
c_print("cyan", line)

Image showing the color in cmd

kwvwclae

kwvwclae6#

这里有一个简单的函数,我发现有用的彩色打印。您不需要进行任何导入,也不必记住复杂的ANSI代码。该函数使用标准的RGB元组来定义前景色和背景色。

def print_in_color(txt_msg,fore_tupple,back_tupple,):
    #prints the text_msg in the foreground color specified by fore_tupple with the background specified by back_tupple 
    #text_msg is the text, fore_tupple is foregroud color tupple (r,g,b), back_tupple is background tupple (r,g,b)
    rf,gf,bf=fore_tupple
    rb,gb,bb=back_tupple
    msg='{0}' + txt_msg
    mat='\33[38;2;' + str(rf) +';' + str(gf) + ';' + str(bf) + ';48;2;' + str(rb) + ';' +str(gb) + ';' + str(bb) +'m' 
    print(msg .format(mat))
    print('\33[0m') # returns default print color to back to black

# example of use using a message with variables
fore_color='cyan'
back_color='dark green'
msg='foreground color is {0} and the background color is {1}'.format(fore_color, back_color)
print_in_color(msg, (0,255,255),(0,127,127))
smdnsysy

smdnsysy7#

在现代Windows系统中,控制台主机窗口应具有ENABLE_VIRTUAL_TERMINAL_PROCESSING模式,以正确处理ANSI颜色序列。
没有外部依赖,纯WinAPI(通过ctypes):

def enable_vt_processing():
   import ctypes
   STD_OUTPUT_HANDLE = -11
   handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
   mode = ctypes.c_ulong()
   ok = ctypes.windll.kernel32.GetConsoleMode(handle, ctypes.byref(mode))
   assert ok
   ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004
   ok = ctypes.windll.kernel32.SetConsoleMode(handle, ctypes.c_ulong(mode.value | ENABLE_VIRTUAL_TERMINAL_PROCESSING))
   assert ok
vql8enpb

vql8enpb8#

添加以下内容以使termcolor也能在Windows中工作:

import colorama
colorama.init()

在StackOverflow上找到的所有问题和答案似乎都是专门针对Windows的,但我确实想补充一点,为Linux制作的应用程序也可能想这样做。如果您需要将程序的输出通过管道从Linux命令行传输到一个新文件中(例如python3 myprogram.py > output.txt),您可能会在该文件中看到奇怪的控制字符!这通常是不可取的,特别是在系统管理员正在使用的日志文件中。上面的代码片段为我在Ubuntu上修复了这个问题。

c90pui9n

c90pui9n9#

如果先清除屏幕,这对linux和windows都有效。

import os

def clr():
    _ = os.system("cls" if os.name == "nt" else "clear")

clr()
for i in range(0, 16):
    for j in range(0, 16):
        color_code = str(i * 16 + j)
        print("\033[38;5;" + color_code + "m" + color_code.rjust(4), end='')
    print("\033[0m")

相关问题