簡體   English   中英

標准庫中某處有ANSI顏色轉義碼列表嗎?

[英]Is there a list of ANSI color escape codes somewhere in the standard libraries?

我寫了很多小助手腳本,並且通常在終端中打印彩色文本。 為了簡化它們的打包和分發,我經常希望這些小腳本沒有任何依賴性。

因此,我在腳本中重復這樣的數據:

ansi_colors = {
    None: '\x1b[0m',  # actually black but whatevs
    'red': '\x1b[31m',
    'green' : '\x1b[32m',
    ...
}

這些數據是否存在於核心庫中的任何位置? 我挖了COLOR_* ,發現curses有一些COLOR_*常量,但它們只是整數,並且它們如何轉換成ANSI轉義碼並不明顯。

我已經知道像termcolorcoloramablessings這樣的模塊,所以請不要建議使用那些 - 我只想依賴標准庫。

您可以查看手冊頁console_codes(4) 你想要的是ECMA-48 Set Graphics Rendition:

ECMA-48 SGR序列ESC [ parameters m設置顯示屬性。 可以在同一序列中設置多個屬性,以分號分隔。 空參數(在分號或字符串啟動器或終結符之間)被解釋為零。

  param result 0 reset all attributes to their defaults 1 set bold 2 set half-bright (simulated with color on a color display) 4 set underscore (simulated with color on a color display) (the colors used to simulate dim or underline are set using ESC ] ...) 5 set blink 7 set reverse video 10 reset selected mapping, display control flag, and toggle meta flag (ECMA-48 says "primary font"). 11 select null mapping, set display control flag, reset toggle meta flag (ECMA-48 says "first alternate font"). 12 select null mapping, set display control flag, set toggle meta flag (ECMA-48 says "second alternate font"). The toggle meta flag causes the high bit of a byte to be toggled before the mapping table translation is done. 21 set normal intensity (ECMA-48 says "doubly underlined") 22 set normal intensity 24 underline off 25 blink off 27 reverse video off 30 set black foreground 31 set red foreground 32 set green foreground 33 set brown foreground 34 set blue foreground 35 set magenta foreground 36 set cyan foreground 37 set white foreground 38 set underscore on, set default foreground color 39 set underscore off, set default foreground color 40 set black background 41 set red background 42 set green background 43 set brown background 44 set blue background 45 set magenta background 46 set cyan background 47 set white background 49 set default background color 

我不認為它們在任何標准Python模塊中都是可用的。 但是如果仔細觀察,你會注意到前景顏色是30加上curses常數,而背景顏色是40加上curses常數。 所以你可以這樣寫:

import curses
def fcolor(c):
    return '\x1B[{0}m'.format(30 + c)
def bcolor(c):
    return '\x1B[{0}m'.format(40 + c)
def fbcolor(f, b):
    return '\x1B[{0};{1}m'.format(30 + f, 40 + b)

print(fbcolor(curses.COLOR_RED, curses.COLOR_YELLOW) + "hello!")

這取決於你想要什么。 ANSI顏色在技術上是指ECMA-48(ISO-6429)隱含的8色調色板,它在curses中命名了常量。 庫不存儲轉義序列; 這些都在數據庫中 對於ANSI (sic)終端,它們對應於設置圖形再現的轉義序列(視頻屬性,如粗體,下划線,反向和顏色)。

termcap,terminfo和curses使用更通用的概念,其中您從顏色編號開始並生成可以生成相應顏色的轉義序列。 終端可以沒有顏色,多種顏色(例如8個,但xterm和類似終端可能有16個,88個,256個)。 告知如何執行此操作的信息作為命名功能存儲在終端數據庫中。 要設置ANSI前景色,您可以使用setaf ,使用庫調用或命令行應用程序(如tput ,例如,

tput setaf 4

顏色4(藍色)。 簡單的應用程序使用低級termcap或terminfo接口,通常使用terminfo數據庫。 雖然您可能傾向於格式化自己的轉義序列,但這些接口提供了格式化功能,可以讓您避免知道終端可能支持的顏色數量。 終端數據庫告訴您的程序,使用TERM環境變量來選擇實際的終端描述。 如果您的終端支持8種以上的顏色,則不會通過向顏色編號添加30或40來形成轉義序列。

以下是使用Python的低級terminfo接口的示例:

import curses

curses.setupterm()
curses.putp(curses.tparm(curses.tigetstr("setaf"), curses.COLOR_RED))
curses.putp(curses.tparm(curses.tigetstr("setab"), curses.COLOR_YELLOW))
curses.putp("hello!")
curses.putp(curses.tigetstr("sgr0"))
curses.putp("\n")

進一步閱讀:

羅德里戈給出了一個很好的答案,雖然顏色僅限於前景的8種顏色。 這是我處理16種前景色彩的小小貢獻

def fcolor(c):
    if c>7:
        return '\x1B[1;{0}m'.format(22 + c)
    else:
        return '\x1B[0;{0}m'.format(30 + c)
def bcolor(c):
    return '\x1B[{0}m'.format(40 + c)
def fbcolor(f, b):
    if f>7:
        return '\x1B[1;{0};{1}m'.format(22 + f, 40 + b)
    else:
        return '\x1B[0;{0};{1}m'.format(30 + f, 40 + b)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM