]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-129900: Fix `SystemExit` return codes when the REPL is started from the...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 25 Mar 2025 20:15:00 +0000 (21:15 +0100)
committerGitHub <noreply@github.com>
Tue, 25 Mar 2025 20:15:00 +0000 (20:15 +0000)
gh-129900: Fix `SystemExit` return codes when the REPL is started from the command line (GH-129901)
(cherry picked from commit 90b82f2b61219c8f94e2deddc989a4c4fe9ea7c7)

Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
Lib/test/test_sys.py
Misc/NEWS.d/next/Core_and_Builtins/2025-02-09-09-54-37.gh-issue-129900.GAGGPn.rst [new file with mode: 0644]
Modules/main.c

index 19597eb75f91689f604e191d22770b7e68ff4db4..72d51361e0b4d10c75be01f67750b57ff139b7ca 100644 (file)
@@ -285,6 +285,27 @@ class SysModuleTest(unittest.TestCase):
             r'import sys; sys.exit("h\xe9")',
             b"h\xe9", PYTHONIOENCODING='latin-1')
 
+    @support.requires_subprocess()
+    def test_exit_codes_under_repl(self):
+        # GH-129900: SystemExit, or things that raised it, didn't
+        # get their return code propagated by the REPL
+        import tempfile
+
+        exit_ways = [
+            "exit",
+            "__import__('sys').exit",
+            "raise SystemExit"
+        ]
+
+        for exitfunc in exit_ways:
+            for return_code in (0, 123):
+                with self.subTest(exitfunc=exitfunc, return_code=return_code):
+                    with tempfile.TemporaryFile("w+") as stdin:
+                        stdin.write(f"{exitfunc}({return_code})\n")
+                        stdin.seek(0)
+                        proc = subprocess.run([sys.executable], stdin=stdin)
+                        self.assertEqual(proc.returncode, return_code)
+
     def test_getdefaultencoding(self):
         self.assertRaises(TypeError, sys.getdefaultencoding, 42)
         # can't check more than the type, as the user might have changed it
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-02-09-09-54-37.gh-issue-129900.GAGGPn.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-02-09-09-54-37.gh-issue-129900.GAGGPn.rst
new file mode 100644 (file)
index 0000000..df15114
--- /dev/null
@@ -0,0 +1 @@
+Fix return codes inside :exc:`SystemExit` not getting returned by the REPL.
index 3bf2241f2837a3341b25573304e93c14d6b28a9b..581c87270ff93f3c31a4676b445f6c07557c0fef 100644 (file)
@@ -572,8 +572,7 @@ pymain_run_stdin(PyConfig *config)
         int run = PyRun_AnyFileExFlags(stdin, "<stdin>", 0, &cf);
         return (run != 0);
     }
-    int run = pymain_run_module(L"_pyrepl", 0);
-    return (run != 0);
+    return pymain_run_module(L"_pyrepl", 0);
 }