gh-130660: Restore sys.ps1 and sys.ps2 after code.interact (#130661)

This commit is contained in:
Tian Gao 2025-02-28 13:15:55 -05:00 committed by GitHub
parent 54965f3fb2
commit fdcbc29f26
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 45 additions and 5 deletions

View file

@ -219,12 +219,17 @@ class InteractiveConsole(InteractiveInterpreter):
"""
try:
sys.ps1
delete_ps1_after = False
except AttributeError:
sys.ps1 = ">>> "
delete_ps1_after = True
try:
sys.ps2
_ps2 = sys.ps2
delete_ps2_after = False
except AttributeError:
sys.ps2 = "... "
delete_ps2_after = True
cprt = 'Type "help", "copyright", "credits" or "license" for more information.'
if banner is None:
self.write("Python %s on %s\n%s\n(%s)\n" %
@ -287,6 +292,12 @@ class InteractiveConsole(InteractiveInterpreter):
if _quit is not None:
builtins.quit = _quit
if delete_ps1_after:
del sys.ps1
if delete_ps2_after:
del sys.ps2
if exitmsg is None:
self.write('now exiting %s...\n' % self.__class__.__name__)
elif exitmsg != '':

View file

@ -39,19 +39,47 @@ class TestInteractiveConsole(unittest.TestCase, MockSys):
self.mock_sys()
def test_ps1(self):
self.infunc.side_effect = EOFError('Finished')
self.infunc.side_effect = [
"import code",
"code.sys.ps1",
EOFError('Finished')
]
self.console.interact()
self.assertEqual(self.sysmod.ps1, '>>> ')
output = ''.join(''.join(call[1]) for call in self.stdout.method_calls)
self.assertIn('>>> ', output)
self.assertNotHasAttr(self.sysmod, 'ps1')
self.infunc.side_effect = [
"import code",
"code.sys.ps1",
EOFError('Finished')
]
self.sysmod.ps1 = 'custom1> '
self.console.interact()
output = ''.join(''.join(call[1]) for call in self.stdout.method_calls)
self.assertIn('custom1> ', output)
self.assertEqual(self.sysmod.ps1, 'custom1> ')
def test_ps2(self):
self.infunc.side_effect = EOFError('Finished')
self.infunc.side_effect = [
"import code",
"code.sys.ps2",
EOFError('Finished')
]
self.console.interact()
self.assertEqual(self.sysmod.ps2, '... ')
output = ''.join(''.join(call[1]) for call in self.stdout.method_calls)
self.assertIn('... ', output)
self.assertNotHasAttr(self.sysmod, 'ps2')
self.infunc.side_effect = [
"import code",
"code.sys.ps2",
EOFError('Finished')
]
self.sysmod.ps2 = 'custom2> '
self.console.interact()
output = ''.join(''.join(call[1]) for call in self.stdout.method_calls)
self.assertIn('custom2> ', output)
self.assertEqual(self.sysmod.ps2, 'custom2> ')
def test_console_stderr(self):

View file

@ -0,0 +1 @@
``sys.ps1`` and ``sys.ps2`` are now restored after :func:`code.interact` call.