CLI ツールを書くときやデバッグ出力を見るとき、こんな疑問を抱いたことはありませんか:
「今 print したこの情報、なぜかトッピングなしのシンプルなラーメンみたいに見えるんだろう?」
すみません、ラーメンを侮辱するつもりはありません。ただ言いたいのは:
もしターミナルをもっと識別しやすく、重要なポイントが一目でわかるようにしたいなら、あなたにはひとつの控えめでありながら強力な主役を知ってほしい:
- ANSI エスケープコード。
それは何ですか?
ANSI はAmerican National Standards Instituteの略で、この組織はさまざまな標準を制定しています。その中にはコンピュータの文字コードも含まれています。
ANSI エスケープコードは、見るからに乱雑な文字列のように見える制御コードのシーケンスです。これらのシーケンスは、\033[
または\x1b[
で始まり、その後にさまざまな制御コードが続きます。
例えば:
print("\033[1;31mHello World\033[0m")
上記のコードは、赤い太字の「Hello World」を出力します。最後の\033[0m
はリセットコードで、後続の出力が赤くならないようにします。
よく使われるフォーマット制御コード
これらのコードを使って、テキストにさまざまなスタイルを適用できます:
数値 | 効果 |
---|---|
0 | Reset(リセット) |
1 | Bold(太字) |
2 | Dim(薄い) |
3 | Italic(イタリック) |
4 | Underline(下線) |
7 | Invert(反転) |
これらは色と組み合わせて使用することができ、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 | 明るい色背景版 |
38
と 89
の間のコードはほとんど触れられていないかもしれませんが、それらはどこに行ったのでしょうか?
-
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()
実行後、結果はこんな感じになります:
組み合わせ構文の例
使用する構文形式:
\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 パッケージを参考にしてください:
-
colorama
クロスプラットフォームで表示でき、Windows の助けになる簡単な使い方:
from colorama import init, Fore, Style
init()
print(Fore.RED + "赤色で表示!" + Style.RESET_ALL) -
termcolor
colored()
を提供し、簡潔に使えます:from termcolor import colored
print(colored("警告", "red", attrs=["bold"])) -
rich
色、テーブル、プログレスバー、Markdown に対応し、CLI の React とも言えるツールです。
from rich import print
print("[bold red]これは太字の赤いテキストです[/bold red]")
まとめ
ANSI エスケープコードを習得すれば、ターミナルにカラーパレットを追加したようなものです。
デバッグから CLI ツールの開発まで、最小限のツールで最も目立つ効果を生み出せます。
さらに重要なのは、ユーザーが「赤はエラー」「緑は成功」「黄色は後で確認」と一目でわかるようにし、もう黒と白だけのメッセージで迷わないようにすることです。
ターミナルの世界をカラフルにし、 AIやフルスタックの情報発信を続けるため、ご支援お願いします。 アイデアからリリースまで、技術面はまるごとお任せください。 カスタム開発や長期支援をご希望の方は、ぜひご相談ください。\033[
から始めましょう。☕ 1杯のコーヒーが支えになります
AI・開発・運用まで一括対応
対応内容
🚀 次のプロジェクト、始めましょう!