Skip to main content
 首页 » 编程设计

python之ANSI 图形代码和 Python

2025年05月04日7jackei

我在浏览 Django 源代码时看到了这个函数:

def colorize(text='', opts=(), **kwargs): 
    """ 
    Returns your text, enclosed in ANSI graphics codes. 
 
    Depends on the keyword arguments 'fg' and 'bg', and the contents of 
    the opts tuple/list. 
 
    Returns the RESET code if no parameters are given. 
 
    Valid colors: 
    'black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white' 
 
    Valid options: 
    'bold' 
    'underscore' 
    'blink' 
    'reverse' 
    'conceal' 
    'noreset' - string will not be auto-terminated with the RESET code 
 
    Examples: 
    colorize('hello', fg='red', bg='blue', opts=('blink',)) 
    colorize() 
    colorize('goodbye', opts=('underscore',)) 
    print colorize('first line', fg='red', opts=('noreset',)) 
    print 'this should be red too' 
    print colorize('and so should this') 
    print 'this should not be red' 
    """ 
    code_list = [] 
    if text == '' and len(opts) == 1 and opts[0] == 'reset': 
        return '\x1b[%sm' % RESET        
    for k, v in kwargs.iteritems():  
        if k == 'fg': 
            code_list.append(foreground[v])  
        elif k == 'bg': 
            code_list.append(background[v])  
    for o in opts: 
        if o in opt_dict: 
            code_list.append(opt_dict[o])    
    if 'noreset' not in opts: 
        text = text + '\x1b[%sm' % RESET 
    return ('\x1b[%sm' % ';'.join(code_list)) + text 

我将它从上下文中删除并放在另一个文件中只是为了尝试它,问题是它似乎没有给我传递给它的文本着色。可能是我没有正确理解它,但它不应该只返回用 ANSI 图形代码包围的文本,终端将转换为实际颜色。

我尝试了调用它的所有给定示例,但它只是返回了我指定为文本的参数。

我正在使用 Ubuntu,所以我认为终端应该支持颜色。

请您参考如下方法:

就是你有很多未定义的术语,因为它依赖于函数外定义的几个变量。

只是

import django.utils.termcolors as termcolors 
red_hello = termcolors.colorize("Hello", fg='red') # '\x1b[31mHello\x1b[0m' 
print red_hello 

或者还专门复制 django/utils/termcolors.py 的前几行:

color_names = ('black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white') 
foreground = dict([(color_names[x], '3%s' % x) for x in range(8)]) 
background = dict([(color_names[x], '4%s' % x) for x in range(8)]) 
RESET = '0' 
 
def colorize( ... ): 
    ... 
print colorize("Hello", fg='red') # '\x1b[31mHello\x1b[0m' 

另请注意:

>>> from django.utils.termcolors import colorize 
>>> red_hello = colorize("Hello", fg="red") 
>>> red_hello # by not printing; it will not appear red; special characters are escaped 
'\x1b[31mHello\x1b[0m' 
>>> print red_hello # by print it will appear red; special characters are not escaped 
Hello