gh-129900: Fix SystemExit return codes when the REPL is started from the command line (#129901)

This commit is contained in:
Peter Bierma 2025-03-25 15:48:46 -04:00 committed by GitHub
parent 8ada7a9e14
commit 90b82f2b61
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 23 additions and 2 deletions

View 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

View file

@ -0,0 +1 @@
Fix return codes inside :exc:`SystemExit` not getting returned by the REPL.

View file

@ -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);
}