gh-72327: Suggest using system terminal for pip install in PyREPL (#136328)
Users new to Python packaging often try to use pip from the REPL only to be met with a confusing SyntaxError. If this happens, guide the user to use a system terminal instead to invoke pip. Closes #72327 --------- Co-authored-by: Tom Viner <tom@viner.tv> Co-authored-by: Brian Schubert <brianm.schubert@gmail.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Co-authored-by: Alyssa Coghlan <ncoghlan@gmail.com>
This commit is contained in:
@@ -27,6 +27,7 @@ import code
|
|||||||
import linecache
|
import linecache
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
import os.path
|
import os.path
|
||||||
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|
||||||
@@ -195,7 +196,19 @@ class InteractiveColoredConsole(code.InteractiveConsole):
|
|||||||
ast.PyCF_ONLY_AST,
|
ast.PyCF_ONLY_AST,
|
||||||
incomplete_input=False,
|
incomplete_input=False,
|
||||||
)
|
)
|
||||||
except (SyntaxError, OverflowError, ValueError):
|
except SyntaxError as e:
|
||||||
|
# If it looks like pip install was entered (a common beginner
|
||||||
|
# mistake), provide a hint to use the system command prompt.
|
||||||
|
if re.match(r"^\s*(pip3?|py(thon3?)? -m pip) install.*", source):
|
||||||
|
e.add_note(
|
||||||
|
"The Python package manager (pip) can only be used"
|
||||||
|
" outside of the Python REPL.\n"
|
||||||
|
"Try the 'pip' command in a separate terminal or"
|
||||||
|
" command prompt."
|
||||||
|
)
|
||||||
|
self.showsyntaxerror(filename, source=source)
|
||||||
|
return False
|
||||||
|
except (OverflowError, ValueError):
|
||||||
self.showsyntaxerror(filename, source=source)
|
self.showsyntaxerror(filename, source=source)
|
||||||
return False
|
return False
|
||||||
if tree.body:
|
if tree.body:
|
||||||
|
|||||||
@@ -1757,3 +1757,14 @@ class TestMain(ReplTestCase):
|
|||||||
output, _ = self.run_repl("1\n1+2\nexit()\n", cmdline_args=['-Xshowrefcount'], env=env)
|
output, _ = self.run_repl("1\n1+2\nexit()\n", cmdline_args=['-Xshowrefcount'], env=env)
|
||||||
matches = re.findall(r'\[-?\d+ refs, \d+ blocks\]', output)
|
matches = re.findall(r'\[-?\d+ refs, \d+ blocks\]', output)
|
||||||
self.assertEqual(len(matches), 3)
|
self.assertEqual(len(matches), 3)
|
||||||
|
|
||||||
|
def test_detect_pip_usage_in_repl(self):
|
||||||
|
for pip_cmd in ("pip", "pip3", "python -m pip", "python3 -m pip"):
|
||||||
|
with self.subTest(pip_cmd=pip_cmd):
|
||||||
|
output, exit_code = self.run_repl([f"{pip_cmd} install sampleproject", "exit"])
|
||||||
|
self.assertIn("SyntaxError", output)
|
||||||
|
hint = (
|
||||||
|
"The Python package manager (pip) can only be used"
|
||||||
|
" outside of the Python REPL"
|
||||||
|
)
|
||||||
|
self.assertIn(hint, output)
|
||||||
|
|||||||
@@ -1744,6 +1744,7 @@ Joel Shprentz
|
|||||||
Yue Shuaijie
|
Yue Shuaijie
|
||||||
Jaysinh Shukla
|
Jaysinh Shukla
|
||||||
Terrel Shumway
|
Terrel Shumway
|
||||||
|
Richard Si
|
||||||
Eric Siegerman
|
Eric Siegerman
|
||||||
Reilly Tucker Siemens
|
Reilly Tucker Siemens
|
||||||
Paul Sijben
|
Paul Sijben
|
||||||
@@ -1988,6 +1989,7 @@ Olivier Vielpeau
|
|||||||
Kannan Vijayan
|
Kannan Vijayan
|
||||||
Kurt Vile
|
Kurt Vile
|
||||||
Norman Vine
|
Norman Vine
|
||||||
|
Tom Viner
|
||||||
Pauli Virtanen
|
Pauli Virtanen
|
||||||
Frank Visser
|
Frank Visser
|
||||||
Long Vo
|
Long Vo
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
Suggest using the system command prompt when ``pip install`` is typed into
|
||||||
|
the REPL. Patch by Tom Viner, Richard Si, and Brian Schubert.
|
||||||
Reference in New Issue
Block a user