Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Shorten sleep time on user input

Tags:

python

I'm trying to find a way to shorten a time.sleep(600) if the user inputs a key, without resorting to some ugly hack like:

key_pressed = False
for i in range(600):
    key_pressed = key_was_pressed()
    if not key_pressed:
        time.sleep(1)
    else:
        break
like image 973
François M. Avatar asked May 12 '20 18:05

François M.


1 Answers

This is a cross-platform adaptation of an implementation using signal.alarm interrupt (an idea which is not available on Windows). This code should work for Linux, macOS, and Windows. The 3rd-party helper library readchar can be installed with pip install readchar.

import os
import signal
import sys

from threading import Timer
from readchar import readkey

def wait_for(key="x", timeout=600):
    pid = os.getpid()
    sig = signal.CTRL_C_EVENT if os.name == "nt" else signal.SIGINT
    timer = Timer(timeout, lambda: os.kill(pid, sig))
    print(f"waiting {timeout}s for user to press {key!r} ...")
    timer.start()  # spawn a worker thread to interrupt us later
    while True:
        k = readkey()
        print(f"received {k!r}")
        if k == key:
            timer.cancel()  # cancel the timer
            print("breaking")
            break

def main():
    import sys
    try:
        wait_for(key=sys.argv[1], timeout=int(sys.argv[2]))
    except KeyboardInterrupt as err:
        print("user took too long")

if __name__ == "__main__":
    main()
like image 159
wim Avatar answered Oct 18 '22 04:10

wim