2

私は多くの小さなヘルパー スクリプトを作成しており、多くの場合、これらは端末に色付きのテキストを出力します。パッケージ化と配布を簡素化するために、これらの小さなスクリプトに依存関係を持たないようにしたいことがよくあります。

したがって、スクリプトで次のようなデータを複製しています。

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

このデータはコア ライブラリのどこかに存在しますか? 私は掘り下げて、cursesいくつかのCOLOR_*定数があることを発見しましたが、それらは単なる整数であり、それらがANSIエスケープコードにどのように変換されるかは明らかではありません.

termcolorcolorama、のようなモジュールは既に知っているblessingsので、それらの使用を提案しないでください。標準ライブラリのみに依存したいのです。

4

3 に答える 3

4

マニュアルページを確認できます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加えたものであることがわかります。したがって、次のように書くことができます。curses40curses

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!")
于 2016-05-11T19:06:51.317 に答える
2

それはあなたが望むものに依存します。 ANSI カラーは、技術的には、curses で定数を指定した ECMA-48 (ISO-6429) によって暗示された 8 色パレットを指します。ライブラリはエスケープ シーケンスを保存しません。それらはデータベースにあります。ANSI (sic) 端末の場合、これらはグラフィック表現(太字、下線、反転、色などのビデオ属性)を設定するエスケープ シーケンスに対応します。

termcap、terminfo、および curses は、色番号で開始し、対応する色を生成できるエスケープ シーケンスを生成する、より一般的な概念を使用します。端末には色を付けないことも、複数の色を付けることもできます (たとえば 8 色ですが、xterm や同様の端末では 16、88、256 の可能性があります)。これを行う方法を示す情報は、名前付きの機能として端末データベースに保存されます。ANSIの前景色を設定するにはsetaf、ライブラリ呼び出しまたは などのコマンドライン アプリケーションを使用して、 を使用しますtput

tput setaf 4

カラー 4 (ブルー) の場合。単純なアプリケーションは、通常 terminfo データベースで、低レベルの termcap または 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")

参考文献:

于 2016-05-11T20:40:16.290 に答える