0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ENTERを押す必要のないYes/No確認

Posted at

はじめに

スクリプト実行中に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 でもかまいません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?