# -*- coding: utf-8 -*- """ clone from https://github.com/johejo/inputimeout """ import sys DEFAULT_TIMEOUT = 30.0 INTERVAL = 0.05 SP = ' ' CR = '\r' LF = '\n' CRLF = CR + LF class TimeoutOccurred(Exception): pass def echo(string): sys.stdout.write(string) sys.stdout.flush() def posix_inputimeout(prompt='', timeout=DEFAULT_TIMEOUT): echo(prompt) sel = selectors.DefaultSelector() sel.register(sys.stdin, selectors.EVENT_READ) events = sel.select(timeout) if events: key, _ = events[0] return key.fileobj.readline().rstrip(LF) else: echo(LF) termios.tcflush(sys.stdin, termios.TCIFLUSH) raise TimeoutOccurred def win_inputimeout(prompt='', timeout=DEFAULT_TIMEOUT): echo(prompt) begin = time.monotonic() end = begin + timeout line = '' while time.monotonic() < end: if msvcrt.kbhit(): c = msvcrt.getwche() if c in (CR, LF): echo(CRLF) return line if c == '\003': raise KeyboardInterrupt if c == '\b': line = line[:-1] cover = SP * len(prompt + line + SP) echo(''.join([CR, cover, CR, prompt, line])) else: line += c time.sleep(INTERVAL) echo(CRLF) raise TimeoutOccurred inputimeout = None try: import msvcrt except ImportError: import selectors import termios inputimeout = posix_inputimeout else: import time inputimeout = win_inputimeout