Various changes.
[python_utils.git] / input_utils.py
index 913146a313608398d902a03eef7fe824399cd6fc..648ee301639ec876750ebdd2b5d98e0d01603eaf 100644 (file)
@@ -7,6 +7,8 @@ import signal
 import sys
 from typing import List
 
+import exceptions
+
 
 def single_keystroke_response(
     valid_responses: List[str],
@@ -15,15 +17,13 @@ def single_keystroke_response(
     default_response: str = None,
     timeout_seconds: int = None,
 ) -> str:
-    class TimeoutError(Exception):
-        pass
-
     def _handle_timeout(signum, frame) -> None:
-        raise TimeoutError()
+        raise exceptions.TimeoutError()
 
     def _single_keystroke_response_internal(
         valid_responses: List[str], timeout_seconds=None
     ) -> str:
+        os_special_keystrokes = [3, 26]  # ^C, ^Z
         if timeout_seconds is not None:
             signal.signal(signal.SIGALRM, _handle_timeout)
             signal.alarm(timeout_seconds)
@@ -33,6 +33,8 @@ def single_keystroke_response(
                 response = readchar.readchar()
                 if response in valid_responses:
                     break
+                if ord(response) in os_special_keystrokes:
+                    break
             return response
         finally:
             if timeout_seconds is not None:
@@ -45,7 +47,7 @@ def single_keystroke_response(
         response = _single_keystroke_response_internal(
             valid_responses, timeout_seconds
         )
-    except TimeoutError:
+    except exceptions.TimeoutError:
         if default_response is not None:
             response = default_response
     if prompt is not None: