Skip to content

Commit fdcbc29

Browse files
gh-130660: Restore sys.ps1 and sys.ps2 after code.interact (#130661)
1 parent 54965f3 commit fdcbc29

File tree

3 files changed

+45
-5
lines changed

3 files changed

+45
-5
lines changed

Lib/code.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -219,12 +219,17 @@ def interact(self, banner=None, exitmsg=None):
219219
"""
220220
try:
221221
sys.ps1
222+
delete_ps1_after = False
222223
except AttributeError:
223224
sys.ps1 = ">>> "
225+
delete_ps1_after = True
224226
try:
225-
sys.ps2
227+
_ps2 = sys.ps2
228+
delete_ps2_after = False
226229
except AttributeError:
227230
sys.ps2 = "... "
231+
delete_ps2_after = True
232+
228233
cprt = 'Type "help", "copyright", "credits" or "license" for more information.'
229234
if banner is None:
230235
self.write("Python %s on %s\n%s\n(%s)\n" %
@@ -287,6 +292,12 @@ def interact(self, banner=None, exitmsg=None):
287292
if _quit is not None:
288293
builtins.quit = _quit
289294

295+
if delete_ps1_after:
296+
del sys.ps1
297+
298+
if delete_ps2_after:
299+
del sys.ps2
300+
290301
if exitmsg is None:
291302
self.write('now exiting %s...\n' % self.__class__.__name__)
292303
elif exitmsg != '':

Lib/test/test_code_module.py

+32-4
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,47 @@ def setUp(self):
3939
self.mock_sys()
4040

4141
def test_ps1(self):
42-
self.infunc.side_effect = EOFError('Finished')
42+
self.infunc.side_effect = [
43+
"import code",
44+
"code.sys.ps1",
45+
EOFError('Finished')
46+
]
4347
self.console.interact()
44-
self.assertEqual(self.sysmod.ps1, '>>> ')
48+
output = ''.join(''.join(call[1]) for call in self.stdout.method_calls)
49+
self.assertIn('>>> ', output)
50+
self.assertNotHasAttr(self.sysmod, 'ps1')
51+
52+
self.infunc.side_effect = [
53+
"import code",
54+
"code.sys.ps1",
55+
EOFError('Finished')
56+
]
4557
self.sysmod.ps1 = 'custom1> '
4658
self.console.interact()
59+
output = ''.join(''.join(call[1]) for call in self.stdout.method_calls)
60+
self.assertIn('custom1> ', output)
4761
self.assertEqual(self.sysmod.ps1, 'custom1> ')
4862

4963
def test_ps2(self):
50-
self.infunc.side_effect = EOFError('Finished')
64+
self.infunc.side_effect = [
65+
"import code",
66+
"code.sys.ps2",
67+
EOFError('Finished')
68+
]
5169
self.console.interact()
52-
self.assertEqual(self.sysmod.ps2, '... ')
70+
output = ''.join(''.join(call[1]) for call in self.stdout.method_calls)
71+
self.assertIn('... ', output)
72+
self.assertNotHasAttr(self.sysmod, 'ps2')
73+
74+
self.infunc.side_effect = [
75+
"import code",
76+
"code.sys.ps2",
77+
EOFError('Finished')
78+
]
5379
self.sysmod.ps2 = 'custom2> '
5480
self.console.interact()
81+
output = ''.join(''.join(call[1]) for call in self.stdout.method_calls)
82+
self.assertIn('custom2> ', output)
5583
self.assertEqual(self.sysmod.ps2, 'custom2> ')
5684

5785
def test_console_stderr(self):
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
``sys.ps1`` and ``sys.ps2`` are now restored after :func:`code.interact` call.

0 commit comments

Comments
 (0)