PythonとANSIエスケープシーケンス
プログラミングで標準出力に色をつける例
Cの例:https://en.wikipedia.org/wiki/ANSI_escape_code#In_C
「Python」でもできるのでは? 👉 仕組みを調べたものメモ
Djangoのコマンドでself.stdout.write(self.style.SUCCESS(message))のように書ける
django.utils.termcolors.colorize
'\x1b[%sm'をフォーマットする実装
https://github.com/django/django/blob/361bb8f786f112ee275be136795c0b1ecefff928/django/utils/termcolors.py#L13-L55
パッケージ termcolor (2011)
\033[%dm%sをフォーマットする実装
最近の例だとrich
rich.style.Styleのrenderメソッド
f"\x1b[{attrs}m{text}\x1b[0m"
https://github.com/willmcgugan/rich/blob/b72e002a000ba5d9a58f61b9a8fcb7fec38b7ebe/rich/style.py#L686-L710
感想 rich.color.Colorで見た__rich__を定義した実装、興味深い(Adapterパターンと思われる)※積ん読
確認
\033(0始まりは8進)は、10進で27(int("33", 8))
\x1b(16進)は、10進で27(int("1b", 16))
chr(27)はエスケープ('\x1b'が返った)
参考 https://debimate.jp/2020/04/11/【bash-ruby-python3】ansiエスケープシーケンスを用いた出力文/
code:python
>> print("\033[32mhello\033[0m world")
hello world
>> print("\x1b[32mhello\x1b[0m world")
hello world
シェルスクリプトでやるなら https://qiita.com/ko1nksm/items/095bdb8f0eca6d327233#1-echo-ではなく-printf-を使う