mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
gh-130660: Restore sys.ps1 and sys.ps2 after code.interact (#130661)
This commit is contained in:
parent
54965f3fb2
commit
fdcbc29f26
3 changed files with 45 additions and 5 deletions
13
Lib/code.py
13
Lib/code.py
|
@ -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 != '':
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
``sys.ps1`` and ``sys.ps2`` are now restored after :func:`code.interact` call.
|
Loading…
Add table
Add a link
Reference in a new issue