From 6c07afd04ad5326e63dc47ca545d64002ceee406 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 (GH-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) (cherry picked from commit ee1bbf037ff74ff3c5e7b95623d78aa34744cd49) Co-authored-by: Serhiy Storchaka --- 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 f5564ccf90f7f4..1af1fd25b0aea7 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -155,6 +155,7 @@ def main(del_exitfunc=False): ).start() while True: + request = None try: if exit_now: try: @@ -165,9 +166,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) @@ -177,6 +178,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`.