termiosの使い方
概要
- 端末属性の取得と設定、回線制御、ボーレートの取得と設定
- vim, tmux, screenなどのtemrinalのソフトウェアを作る際に必要な機能と設定
man
stdinのロックを解除して一文字づつ読み込む
- termiosを使った非同期のstdin, stdout
- stdinを普通に読み込もうとするとロックされてしまう
- 同期的にのみにしか操作をおこなえいないので、termiosで設定を変えて非同期的に行えるようにする
- 動作
- 以下の例では現在の状態を取得して、モードを変更して、2秒間、terminalをポーリングする
- 入力された情報を文字列として出力する
import time
import sys
import os
import termios
# ロック解除と前の設定を保存
print(sys.stdin.fileno())
old_settings = termios.tcgetattr(sys.stdin)
new_settings = termios.tcgetattr(sys.stdin)
new_settings[3] = new_settings[3] & ~(termios.ECHO | termios.ICANON) # lflags
new_settings[6][termios.VMIN] = 0
new_settings[6][termios.VTIME] = 0
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, new_settings)
# ロック解除の操作は以下のコマンドとほぼ同じ
# os.system('/bin/stty raw')
start = time.time()
chars = ["test"]
start = time.time()
while time.time() - start < 2:
char = os.read(sys.stdin.fileno(), 1).decode("utf8")
if char != "":
chars.append(char)
# 状態の復元
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)
# 状態の復元は以下のコマンドでも可能
# os.system("/bin/stty cooked")
print("d", "|".join(chars))