Optionally surface exceptions that happen under executors by reading
[python_utils.git] / input_utils.py
index 153641b135cfd7debb9b4e20e60ca400316c4dca..e0b457d5a0e73ffc43d3d83ff09228328e6a641e 100644 (file)
@@ -2,14 +2,19 @@
 
 """Utilities related to user input."""
 
-import readchar  # type: ignore
+import logging
 import signal
 import sys
 from typing import List
 
+import readchar  # type: ignore
+
 import exceptions
 
 
+logger = logging.getLogger(__file__)
+
+
 def single_keystroke_response(
     valid_responses: List[str],
     *,
@@ -33,6 +38,7 @@ def single_keystroke_response(
         try:
             while True:
                 response = readchar.readchar()
+                logger.debug(f'Keystroke: {ord(response)}')
                 if response in valid_responses:
                     break
                 if ord(response) in os_special_keystrokes:
@@ -49,6 +55,9 @@ def single_keystroke_response(
         response = _single_keystroke_response_internal(
             valid_responses, timeout_seconds
         )
+        if ord(response) == 3:
+            raise KeyboardInterrupt('User pressed ^C in input_utils.')
+
     except exceptions.TimeoutError:
         if default_response is not None:
             response = default_response