https://github.com/python/cpython/commit/90b82f2b61219c8f94e2deddc989a4c4fe9ea7c7 commit: 90b82f2b61219c8f94e2deddc989a4c4fe9ea7c7 branch: main author: Peter Bierma <zintensity...@gmail.com> committer: vstinner <vstin...@python.org> date: 2025-03-25T19:48:46Z summary:
gh-129900: Fix `SystemExit` return codes when the REPL is started from the command line (#129901) files: A Misc/NEWS.d/next/Core_and_Builtins/2025-02-09-09-54-37.gh-issue-129900.GAGGPn.rst M Lib/test/test_sys.py M Modules/main.c diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 87c0106ad30840..b1d63c517ef8f2 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -285,6 +285,27 @@ def check_exit_message(code, expected, **env_vars): 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 index 00000000000000..df15114cff7eb6 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-02-09-09-54-37.gh-issue-129900.GAGGPn.rst @@ -0,0 +1 @@ +Fix return codes inside :exc:`SystemExit` not getting returned by the REPL. diff --git a/Modules/main.c b/Modules/main.c index 3fda4fb4732bb1..c2b7bfde2abd7c 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -556,8 +556,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); } _______________________________________________ Python-checkins mailing list -- python-checkins@python.org To unsubscribe send an email to python-checkins-le...@python.org https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: arch...@mail-archive.com