From ee1bbf037ff74ff3c5e7b95623d78aa34744cd49 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 26 Sep 2026 05:05:24 +0300 Subject: [PATCH] gh-71136: Fix IDLE Shell hang after KeyboardInterrupt under the debugger (#157566) Debugging 'raise KeyboardInterrupt' in debugged code no longer hangs IDLE forever. The response is similar to without the debugger. --------- Co-authored-by: Louie Lu Co-authored-by: Claude Opus 5 (1M context) --- Lib/idlelib/run.py | 7 ++++++- .../IDLE/2026-09-15-15-46-35.gh-issue-71136.vwGO0v.rst | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/IDLE/2026-09-15-15-46-35.gh-issue-71136.vwGO0v.rst diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index c69060620f5f9f..48e8f3c4605fc0 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -164,6 +164,7 @@ def main(del_exitfunc=False): ).start() while True: + request = None try: if exit_now: try: @@ -174,9 +175,9 @@ def main(del_exitfunc=False): try: request = rpc.request_queue.get(block=True, timeout=0.05) except queue.Empty: - request = None # Issue 32207: calling handle_tk_events here adds spurious # queue.Empty traceback to event handling exceptions. + pass if request: seq, (method, args, kwargs) = request ret = method(*args, **kwargs) @@ -186,6 +187,10 @@ def main(del_exitfunc=False): except KeyboardInterrupt: if quitting: exit_now = True + elif request: + # Interrupted while executing a request, as when debugging. + print_exception() + rpc.response_queue.put((seq, None)) continue except SystemExit: capture_warnings(False) diff --git a/Misc/NEWS.d/next/IDLE/2026-09-15-15-46-35.gh-issue-71136.vwGO0v.rst b/Misc/NEWS.d/next/IDLE/2026-09-15-15-46-35.gh-issue-71136.vwGO0v.rst new file mode 100644 index 00000000000000..794a51b2b32e85 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2026-09-15-15-46-35.gh-issue-71136.vwGO0v.rst @@ -0,0 +1,2 @@ +Fix a hang of the IDLE Shell when code run under the debugger raises +:exc:`KeyboardInterrupt`.