]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-130660: Restore sys.ps1 and sys.ps2 after code.interact (#130661)
authorTian Gao <gaogaotiantian@hotmail.com>
Fri, 28 Feb 2025 18:15:55 +0000 (13:15 -0500)
committerGitHub <noreply@github.com>
Fri, 28 Feb 2025 18:15:55 +0000 (13:15 -0500)
Lib/code.py
Lib/test/test_code_module.py
Misc/NEWS.d/next/Library/2025-02-28-01-10-14.gh-issue-130660.VIThEz.rst [new file with mode: 0644]

index 1cc2ed8b1dbf28f4c4544747a757099de843af7e..41331dfd071f1103931c7155baeb11219470b403 100644 (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 != '':
index faa0b38f8373e3dd115a9204e50f971a09c9a957..57fb130070b34edfb1e69906dedb3c2cf919fce6 100644 (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):
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 (file)
index 0000000..92984e7
--- /dev/null
@@ -0,0 +1 @@
+``sys.ps1`` and ``sys.ps2`` are now restored after :func:`code.interact` call.