Pythonのttyモジュールでターミナルを制御する方法(rawモード・cbreakモード)
Unix系システムでターミナル(端末)の制御設定を変更したい場合、Python標準ライブラリのttyモジュールを利用できます。このモジュールを使うと、ターミナルを2つの異なるモード、すなわち「rawモード」と「cbreakモード」に切り替えることが可能です。
なお、ttyモジュールはLinuxやmacOSなどのUnix系OS向けの機能であり、Windows環境では使用できない点に注意してください。
ttyモジュールを利用するには、まず以下のようにインポートします。
import tty
ttyモジュールには主に次の2つの関数が用意されています。
tty.setraw(fd, when = termios.TCSAFLUSH)
この関数は、指定したファイルディスクリプタ(fd)のターミナルをrawモードに変更します。
rawモードでは、出力時の改行によってカーソルは次の行へ移動しますが、復帰(CR:キャリッジリターン)処理は行われません。そのため、出力が階段状に少しずつ右へずれて表示されます。
また、入力に関してはReturn(Enter)キーを押さなくても、1文字入力するたびに自動的にシステムへ送信される点が大きな特徴です。
tty.setcbreak(fd, when = termios.TCSAFLUSH)
この関数は、ターミナルをcbreakモードに変更します。
cbreakモードでも、Returnキーを押さずに入力した文字が即座にシステムへ渡される点はrawモードと共通です。一方で、rawモードとは異なり、出力時の通常の改行・復帰処理(CR/LF変換)や、Ctrl+Cなどの割り込みキーによるシグナル処理は引き続き有効になります。
サンプルコード
以下は、ターミナルをrawモードに切り替えて、キー入力を1文字ずつ読み取る例です。
import sys
import tty
import termios
file_desc = sys.stdin.fileno()
old_setting = termios.tcgetattr(file_desc)
tty.setraw(sys.stdin)
for i in range(5):
char = sys.stdin.read(1)
print("Char: " + str(char))
termios.tcsetattr(file_desc, termios.TCSADRAIN, old_setting)
このコードでは、最初にtermios.tcgetattr()で現在のターミナル設定を保存しておき、処理の最後にtermios.tcsetattr()で元の設定へ復元しています。これにより、プログラム終了後もターミナルが正常な状態に戻り、予期しない不具合を防げます。
実行結果
$ python3 example.py
Char: K
Char: E
Char: 5
Char: 2
Char: @
実行結果を見ると、「K」「E」「5」「2」「@」という文字が順番に読み取られていることが分かります。rawモードでは復帰処理が行われないため、各行の出力が階段状に右へずれて表示されている点にも注目してください。
-
Pythonでターミナル出力に色を付ける方法
ターミナル上でテキストを色付きで表示したい場面はよくあります。Pythonでは、ANSIエスケープシーケンスを直接扱う以外にも、専用ライブラリを使えば簡単に実現できます。ここでは、代表的なライブラリ「termcolor」を使った方法を紹介します。 Pythonモジュールを使う方法 termcolorモジュールとは termcolorは、ターミナル出力向けのANSIカラーフォーマットを提供する軽量ライブラリです。まずpipでインストールしておきましょう。 pip install termcolor 主な関数は次の2つです。 colored(): 色付きの文字列を返します。print()などと組
-
Pythonのmathモジュール完全ガイド|定数・数値関数・べき乗・三角関数の使い方
Pythonのmathモジュールとは Pythonのmathモジュールは、数学計算のための関数や定数をまとめた標準ライブラリです。このモジュールの関数は整数型や浮動小数点型(実数)のオブジェクトを対象としており、複素数には対応していません。複素数を扱いたい場合は、代わりにcmathモジュールを使用します。 mathモジュールを利用するには、まずコード内でインポートします。 import math mathモジュールの主な定数 mathモジュールには、計算式の中でそのまま使える便利な定数が用意されています。 番号定数と説明 1pi円周率πの値を返します(3.141592…)。 2E自然対数