はじめに
スクリプト実行中にYes/No確認したくなる時がある。
なにかを削除するとか、注意が必要で無条件に実行したくない処理では、念のため確認したくなる。
でも、運用してると、「Y」「ENTER」とか「N」「ENTER」とか押すのが面倒になってくる。
「Y」「N」だけじゃダメなの? という気になる。
そして、「ENTER」を押さずにYes/No確認したい場合、こんな感じの関数を準備しておけば対応できる。
コード例
import sys
import termios
def yesno():
result = ''
attribute = termios.tcgetattr(sys.stdin)
temp = termios.tcgetattr(sys.stdin)
temp[3] &= ~(termios.ICANON | termios.ECHO)
termios.tcsetattr(sys.stdin, termios.TCSAFLUSH, temp)
try:
while True:
char = sys.stdin.read(1)
if char == 'y' or char == 'Y':
result = 'Y'
break
elif char == 'n' or char == 'N':
result = 'N'
break
except KeyboardInterrupt:
result = '^C'
termios.tcsetattr(sys.stdin, termios.TCSAFLUSH, attribute)
return result
key = yesno()
# key: 'Y' or 'N' or '^C'
ここではPythonで書いたが、termiosを操作できる環境なら似たような記述ができるだろう。
補足
Pythonでtermiosを使うコード例で、 fd = sys.stdin.fileno()
の記述があり、それ以降は fd
を使ってるのを見かけることがある。
でも、 sys.stdin
を使うのが好みだ。
ファイルディスクリプタが必要そうに見えるところに sys.stdin
とか書いちゃうのは気持ち悪く感じるので嫌いだが、1行短くなるのは好きだ。
All functions in this module take a file descriptor fd as their first argument. This can be an integer file descriptor, such as returned by sys.stdin.fileno(), or a file object, such as sys.stdin itself.
このモジュールの関数は全て、ファイル記述子 fd を最初の引数としてとります。この値は、 sys.stdin.fileno() が返すような整数のファイル記述子でも、 sys.stdin 自体のような file object でもかまいません。