1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
# DP: Disable ensurepip for the system installation, only enable it for virtual environments.
--- a/Lib/ensurepip/__init__.py
+++ b/Lib/ensurepip/__init__.py
@@ -11,6 +11,34 @@ from importlib import resources
__all__ = ["version", "bootstrap"]
+def _ensurepip_is_disabled_in_debian_for_system():
+ # Detect if ensurepip is being executed inside of a python-virtualenv
+ # environment and return early if so.
+ if hasattr(sys, 'real_prefix'):
+ return
+
+ # Detect if ensurepip is being executed inside of a stdlib venv
+ # environment and return early if so.
+ if sys.prefix != getattr(sys, "base_prefix", sys.prefix):
+ return
+
+ # If we've gotten here, then we are running inside of the system Python
+ # and we don't want to use ensurepip to install into the system Python
+ # so instead we'll redirect the user to using dpkg and apt-get.
+ print('''\
+ensurepip is disabled in Debian/Ubuntu for the system python.
+
+Python modules for the system python are usually handled by dpkg and apt-get.
+
+ apt-get install python-<module name>
+
+Install the python-pip package to use pip itself. Using pip together
+with the system python might have unexpected results for any system installed
+module, so use it on your own risk, or make sure to only use it in virtual
+environments.
+''')
+ sys.exit(1)
+
_PROJECTS = [
"setuptools",
@@ -78,6 +106,11 @@ def _bootstrap(*, root=None, upgrade=Fal
Note that calling this function will alter both sys.path and os.environ.
"""
+
+ # Ensure that we are only running this inside of a virtual environment
+ # of some kind.
+ _ensurepip_is_disabled_in_debian_for_system()
+
if altinstall and default_pip:
raise ValueError("Cannot use altinstall and default_pip together")
--- a/Lib/venv/__init__.py
+++ b/Lib/venv/__init__.py
@@ -295,7 +295,28 @@ class EnvBuilder:
# intended for the global Python environment
cmd = [context.env_exe, '-Im', 'ensurepip', '--upgrade',
'--default-pip']
- subprocess.check_output(cmd, stderr=subprocess.STDOUT)
+ # Debian 2015-09-18 barry@debian.org: <python>-venv is a separate
+ # binary package which might not be installed. In that case, the
+ # following command will produce an unhelpful error. Let's make it
+ # more user friendly.
+ try:
+ subprocess.check_output(
+ cmd, stderr=subprocess.STDOUT,
+ universal_newlines=True)
+ except subprocess.CalledProcessError:
+ print("""\
+The virtual environment was not created successfully because ensurepip is not
+available. On Debian/Ubuntu systems, you need to install the python3-venv
+package using the following command.
+
+ apt-get install python3-venv
+
+You may need to use sudo with that command. After installing the python3-venv
+package, recreate your virtual environment.
+
+Failing command: {}
+""".format(cmd))
+ sys.exit(1)
def setup_scripts(self, context):
"""
|