https://github.com/python/cpython/commit/90b82f2b61219c8f94e2deddc989a4c4fe9ea7c7
commit: 90b82f2b61219c8f94e2deddc989a4c4fe9ea7c7
branch: main
author: Peter Bierma <[email protected]>
committer: vstinner <[email protected]>
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 -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]