From 474020fc523a9e29720de08f68108f146b20ef4f Mon Sep 17 00:00:00 2001 From: adam j hartz Date: Sun, 20 Jul 2025 02:19:07 -0400 Subject: [PATCH 1/4] make code.interact match REPL behavior on ctrl+d --- Lib/code.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/Lib/code.py b/Lib/code.py index f7e275d8801b7c..2d5b5cdc8f58be 100644 --- a/Lib/code.py +++ b/Lib/code.py @@ -263,6 +263,7 @@ def interact(self, banner=None, exitmsg=None): try: while True: try: + received_eof = False if more: prompt = sys.ps2 else: @@ -270,8 +271,26 @@ def interact(self, banner=None, exitmsg=None): try: line = self.raw_input(prompt) except EOFError: - self.write("\n") - break + received_eof = True + if received_eof: + if more: + source = "\n".join(self.buffer) + try: + code = self.compile.compiler( + source, + self.filename, + "single", + incomplete_input=False, + ) + self.runcode(code) + self.write("\n") + except (SyntaxError, IndentationError): + self.showsyntaxerror(self.filename, source=source) + self.resetbuffer() + more = False + else: + self.write("\n") + break else: more = self.push(line) except KeyboardInterrupt: From 86280112a06ac467eb16d56c0e73e3f3d6799f09 Mon Sep 17 00:00:00 2001 From: adam j hartz Date: Thu, 9 Oct 2025 19:37:15 -0400 Subject: [PATCH 2/4] add news entry --- .../2025-10-09-19-37-05.gh-issue-139875.pg95dm.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-09-19-37-05.gh-issue-139875.pg95dm.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-09-19-37-05.gh-issue-139875.pg95dm.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-09-19-37-05.gh-issue-139875.pg95dm.rst new file mode 100644 index 00000000000000..8d5dd6e7121a30 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-09-19-37-05.gh-issue-139875.pg95dm.rst @@ -0,0 +1,2 @@ +Fix difference in Ctrl+D handling between :func:`code.interact` and the Python +REPL. Patch by Adam Hartz From 29d47c81c820bc3f29f85fe876d3d91a71cb17b7 Mon Sep 17 00:00:00 2001 From: adam j hartz Date: Thu, 9 Oct 2025 20:12:06 -0400 Subject: [PATCH 3/4] adjust test for sqlite3 CLI, which depends on InteractiveConsole's behavior --- Lib/test/test_sqlite3/test_cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_sqlite3/test_cli.py b/Lib/test/test_sqlite3/test_cli.py index 5926cec0569ddb..f887eb07a4544d 100644 --- a/Lib/test/test_sqlite3/test_cli.py +++ b/Lib/test/test_sqlite3/test_cli.py @@ -168,8 +168,8 @@ def test_interact_valid_sql(self): def test_interact_incomplete_multiline_sql(self): out, err = self.run_cli(commands=("SELECT 1",)) self.assertIn(self.MEMORY_DB_MSG, err) - self.assertEndsWith(out, self.PS2) - self.assertEqual(out.count(self.PS1), 1) + self.assertEqual(out.count(self.PS1), 2) + self.assertEqual(err.count('SyntaxError'), 1) self.assertEqual(out.count(self.PS2), 1) def test_interact_valid_multiline_sql(self): From b0aca985e837bdd28373d9c641aa904c8ce287f6 Mon Sep 17 00:00:00 2001 From: adam j hartz Date: Thu, 9 Oct 2025 20:39:46 -0400 Subject: [PATCH 4/4] Revert broken attempt at fixing sqlite CLI test This reverts commit 29d47c81c820bc3f29f85fe876d3d91a71cb17b7. --- Lib/test/test_sqlite3/test_cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_sqlite3/test_cli.py b/Lib/test/test_sqlite3/test_cli.py index f887eb07a4544d..5926cec0569ddb 100644 --- a/Lib/test/test_sqlite3/test_cli.py +++ b/Lib/test/test_sqlite3/test_cli.py @@ -168,8 +168,8 @@ def test_interact_valid_sql(self): def test_interact_incomplete_multiline_sql(self): out, err = self.run_cli(commands=("SELECT 1",)) self.assertIn(self.MEMORY_DB_MSG, err) - self.assertEqual(out.count(self.PS1), 2) - self.assertEqual(err.count('SyntaxError'), 1) + self.assertEndsWith(out, self.PS2) + self.assertEqual(out.count(self.PS1), 1) self.assertEqual(out.count(self.PS2), 1) def test_interact_valid_multiline_sql(self):