メインコンテンツまでスキップ

ターミナルは黒と白だけではない

CLI ツールを書くときやデバッグ出力を見るとき、こんな疑問を抱いたことはありませんか:

「今 print したこの情報、なぜかトッピングなしのシンプルなラーメンみたいに見えるんだろう?」

すみません、ラーメンを侮辱するつもりはありません。ただ言いたいのは:

もしターミナルをもっと識別しやすく、重要なポイントが一目でわかるようにしたいなら、あなたにはひとつの控えめでありながら強力な主役を知ってほしい:

  • ANSI エスケープコード

それは何ですか?

ANSI はAmerican National Standards Instituteの略で、この組織はさまざまな標準を制定しています。その中にはコンピュータの文字コードも含まれています。

ANSI エスケープコードは、見るからに乱雑な文字列のように見える制御コードのシーケンスです。これらのシーケンスは、\033[または\x1b[で始まり、その後にさまざまな制御コードが続きます。

例えば:

print("\033[1;31mHello World\033[0m")

上記のコードは、赤い太字の「Hello World」を出力します。最後の\033[0mはリセットコードで、後続の出力が赤くならないようにします。

よく使われるフォーマット制御コード

これらのコードを使って、テキストにさまざまなスタイルを適用できます:

数値効果
0Reset(リセット)
1Bold(太字)
2Dim(薄い)
3Italic(イタリック)
4Underline(下線)
7Invert(反転)

これらは色と組み合わせて使用することができ、CLI に「個性」を持たせることができます。

備考

ANSI 制御コードの豆知識:5 と 6 はどこに行ったの?

実は、これらはずっと存在していますが、大抵は見えません。

  • 5 = ゆっくり点滅(slow blink)
  • 6 = 速い点滅(rapid blink)

ただし……

ほとんどのターミナルではこれらをサポートしていません。特に現代のシステムでは目を保護するため、点滅効果はほとんど無効にされています。

試してみることができます:

print("\033[5;31mこれはゆっくり点滅する赤い文字です\033[0m")

もし本当に点滅したら、あなたのターミナルは古代の時代に生きているということですね 😅

色の制御コード

ANSI エスケープコードで使用される文字色のコードは、通常、30〜37(標準色)と 90〜97(明るい色)です。

以下はその対応表です:

数値
30黒色
31赤色
32緑色
33黄色
34青色
35マゼンタ
36シアン
37白色
90–97明るい色系

背景色の制御コードは、40〜47(標準色)と 100〜107(明るい色)に対応しており、同様に以下のように利用できます:

数値背景色
40黒色背景 (Black)
41赤色背景 (Red)
42緑色背景 (Green)
43黄色背景 (Yellow)
44青色背景 (Blue)
45マゼンタ背景 (Magenta)
46シアン背景 (Cyan)
47白色背景 (White)
100–107明るい色背景版

3889 の間のコードはほとんど触れられていないかもしれませんが、それらはどこに行ったのでしょうか?

  • 38 と 48:カスタムカラーの高度な使い方

    • 38 = 「カスタム前景色」モードを有効にする

    • 48 = 「カスタム背景色」モードを有効にする

      この場合、さらにパラメータを追加して色を指定する必要があります。例えば 256 色(8 ビットモード):

      print("\033[38;5;198mピンク色の文字\033[0m")
      • 38;5;198 は、256 色パレットの 198 番目の色を使用することを意味します。

      または、True Color(24 ビットモード)を使用することもできます:

      print("\033[38;2;255;105;180mピンク色で表示!\033[0m")
      • 38;2;<r>;<g>;<b> を使用すると、RGB 値を正確に指定できます。
  • 39 と 49:色をリセットする友達

    • 39:デフォルトの前景色に戻す
    • 49:デフォルトの背景色に戻す
ヒント

では、50 ~ 89 はどうなのか?

それらは何でもありません!

この数値範囲は ANSI 規格に明確に定義されていません。これは予約領域または歴史的な空間です。一部のターミナル(例えば、Konsole や xterm など)では実験的に使用されたことがありますが、標準的な機能ではありません。

これらの数値を強引に使っても、ほとんどのターミナルは無視します。

というわけで、色コードマップはおおよそ以下のようになります:

範囲機能
30–37標準前景色
90–97明るい前景色
38高度な前景色(256 色 / RGB)
39前景色をリセット
40–47標準背景色
100–107明るい背景色
48高度な背景色(256 色 / RGB)
49背景色をリセット
50–89⚠️ 予約領域、触らない方が良い

以下のコードを使って試してみましょう:

for i in range(256):
print(f"\033[48;5;{i}m {i:3} \033[0m", end=" ")
if i % 16 == 15:
print()

実行後、結果はこんな感じになります:

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255

組み合わせ構文の例

使用する構文形式:

\033[<フォーマット>;<文字色>m

例:

def colorstr(text, fmt=1, color=34):
return f"\033[{fmt};{color}m{text}\033[0m"

print(colorstr("これは青色の太字テキストです"))

さらにおしゃれに:

print("\033[1;34;43m青い文字と黄色い背景、ファッショナブルに決めた\033[0m")

注意点

使用時にはいくつか注意すべき点があります。彩色を災難にしないために:

  • 必ずリセットする\033[0mを追加しないと、出力がそのまま引き継がれて、赤い悲劇が赤い長編小説に変わります。
  • Jupyter の制限:色は表示できても、カーソルや画面制御は基本的に無理です。
  • Windows Terminal はアップグレードされた:新しいバージョンではようやくまともになりました。古いバージョンではcoloramaを使いましょう。
  • ログファイルに無闇に埋め込まない:正規表現で自分を罰したいのでなければ、純粋なテキストバージョンで保存することをお勧めします。

拡張応用

自分だけのカラー・ツールモジュールを作成し、Enum を使ってよりクリーンな呼び出し方法を書けます:

from enum import Enum

class COLOR(Enum):
RED = 31
GREEN = 32
BLUE = 34

class FORMAT(Enum):
BOLD = 1
UNDERLINE = 4

def colorstr(obj, color=COLOR.BLUE, fmt=FORMAT.BOLD):
return f"\033[{fmt.value};{color.value}m{obj}\033[0m"

使用例:

  • エラーメッセージと警告:赤で「ここに問題があります」と表示。
  • 成功メッセージ:緑色のチェックマークで「成功!」。
  • インタラクティブなメニュー提示:ユーザーに入力を促す。

自分で処理したくない?

多くのパッケージがすでにパッケージ化されていますので、直接使うことができます。

以下の Python パッケージを参考にしてください:

  1. colorama

    クロスプラットフォームで表示でき、Windows の助けになる簡単な使い方:

    from colorama import init, Fore, Style
    init()
    print(Fore.RED + "赤色で表示!" + Style.RESET_ALL)
  2. termcolor

    colored()を提供し、簡潔に使えます:

    from termcolor import colored
    print(colored("警告", "red", attrs=["bold"]))
  3. rich

    色、テーブル、プログレスバー、Markdown に対応し、CLI の React とも言えるツールです。

    from rich import print
    print("[bold red]これは太字の赤いテキストです[/bold red]")

まとめ

ANSI エスケープコードを習得すれば、ターミナルにカラーパレットを追加したようなものです。

デバッグから CLI ツールの開発まで、最小限のツールで最も目立つ効果を生み出せます。

さらに重要なのは、ユーザーが「赤はエラー」「緑は成功」「黄色は後で確認」と一目でわかるようにし、もう黒と白だけのメッセージで迷わないようにすることです。

ターミナルの世界をカラフルにし、\033[から始めましょう。

☕ 1杯のコーヒーが支えになります

AIやフルスタックの情報発信を続けるため、ご支援お願いします。

cta-button
AI・開発・運用まで一括対応 icon
ALL

AI・開発・運用まで一括対応

アイデアからリリースまで、技術面はまるごとお任せください。

対応内容
  • 技術相談 + 開発 + デプロイ
  • 継続サポート & 拡張

🚀 次のプロジェクト、始めましょう!

カスタム開発や長期支援をご希望の方は、ぜひご相談ください。