aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--Lib/code.py13
-rw-r--r--Lib/test/test_code_module.py36
-rw-r--r--Misc/NEWS.d/next/Library/2025-02-28-01-10-14.gh-issue-130660.VIThEz.rst1
3 files changed, 45 insertions, 5 deletions
diff --git a/Lib/code.py b/Lib/code.py
index 1cc2ed8b1db..41331dfd071 100644
--- a/Lib/code.py
+++ b/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 != '':
diff --git a/Lib/test/test_code_module.py b/Lib/test/test_code_module.py
index faa0b38f837..57fb130070b 100644
--- a/Lib/test/test_code_module.py
+++ b/Lib/test/test_code_module.py
@@ -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):
diff --git a/Misc/NEWS.d/next/Library/2025-02-28-01-10-14.gh-issue-130660.VIThEz.rst b/Misc/NEWS.d/next/Library/2025-02-28-01-10-14.gh-issue-130660.VIThEz.rst
new file mode 100644
index 00000000000..92984e7e2d5
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-02-28-01-10-14.gh-issue-130660.VIThEz.rst
@@ -0,0 +1 @@
+``sys.ps1`` and ``sys.ps2`` are now restored after :func:`code.interact` call.