termios --- POSIX スタイルの端末制御


このモジュールでは端末 I/O 制御のための POSIX 準拠の関数呼び出しインターフェースを提供します。これら呼び出しのための完全な記述については、 Unix マニュアルページの termios(3) を参照してください。これは POSIX termios 形式の端末制御をサポートしていてインストール時に有効にした Unix のバージョンでのみ利用可能です。

このモジュールの関数は全て、ファイル記述子 fd を最初の引数としてとります。この値は、 sys.stdin.fileno() が返すような整数のファイル記述子でも、 sys.stdin 自体のような file object でもかまいません。

このモジュールでは、ここで提供する関数を使うために必要なすべての定数も定義しています。 定数の名前は C の対応する定数と同じです。 これらの端末制御インターフェースの使い方については、システムのドキュメントを参照してください。

このモジュールには、以下の関数が定義されています:

termios.tcgetattr(fd)

ファイル記述子 fd の端末属性を含むリストを返します。その形式は: [iflag, oflag, cflag, lflag, ispeed, ospeed, cc] です。 cc は端末特殊文字のリストです (それぞれ長さ 1 の文字列です。ただしインデクス VMIN および VTIME の内容は、それらのフィールドが定義されていた場合整数の値となります)。端末設定フラグおよび端末速度の解釈、および配列 cc のインデクス検索は、 termios で定義されているシンボル定数を使って行わなければなりません。

termios.tcsetattr(fd, when, attributes)

ファイル記述子 fd の tty 属性を attributes に設定します。 attributes は tcgetattr() が返すものと同じ形式のリストです。 属性を変更するタイミングは when 引数で指定します。

termios.TCSANOW

属性を直ちに変更します。

termios.TCSADRAIN

キューにある出力をすべて送信してから属性を変更します。

termios.TCSAFLUSH

キューにある出力をすべて送信し、キューにある入力をすべて破棄してから属性を変更します。

termios.tcsendbreak(fd, duration)

ファイル記述子 fd にブレークを送信します。duration をゼロにすると、0.25〜0.5 秒間のブレークを送信します; duration の値がゼロでない場合、その意味はシステム依存です。

termios.tcdrain(fd)

ファイル記述子 fd に書き込まれた全ての出力が転送されるまで待ちます。

termios.tcflush(fd, queue)

ファイル記述子 fd にキューに入っているデータを破棄します。 どのキューかは queue セレクタで指定します: TCIFLUSH は入力キュー、 TCOFLUSH は出力キュー、 TCIOFLUSH は両方のキューです。

termios.tcflow(fd, action)

ファイル記述子 fd の入力または出力をサスペンドしたりレジュームしたりします。引数 action は出力をサスペンドする TCOOFF 、出力をレジュームする TCOON 、入力をサスペンドする TCIOFF 、入力をレジュームする TCION をとることができます。

termios.tcgetwinsize(fd)

ファイル記述子 fd の tty ウィンドウサイズを表すタプル (ws_row, ws_col) を返します。 termios.TIOCGWINSZ または termios.TIOCGSIZE が必要です。

Added in version 3.11.

termios.tcsetwinsize(fd, winsize)

ファイル記述子 fd の tty ウィンドウサイズを winsize に設定します。 winsize は tcgetwinsize() が返すものと同じ形式の、2 要素のタプル (ws_row, ws_col) です。 (termios.TIOCGWINSZ, termios.TIOCSWINSZ) と (termios.TIOCGSIZE, termios.TIOCSSIZE) のうち、少なくとも一方の組が定義されている必要があります。

Added in version 3.11.

参考

tty モジュール

一般的な端末制御操作のための便利な関数。

使用例

以下はエコーバックを切った状態でパスワード入力を促す関数です。 何が起きても元の tty 属性を正確に復元できるように、tcgetattr() を別々に呼び出し、try ... finally 文を使う手法に注目してください。

def getpass(prompt="Password: "):
    import termios, sys
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    new = termios.tcgetattr(fd)
    new[3] = new[3] & ~termios.ECHO          # lflags
    try:
        termios.tcsetattr(fd, termios.TCSADRAIN, new)
        passwd = input(prompt)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
    return passwd