ensurepip-disabled
authorMatthias Klose <doko@debian.org>
Fri, 5 Feb 2021 13:46:56 +0000 (13:46 +0000)
committerMatthias Klose <doko@debian.org>
Fri, 5 Feb 2021 13:46:56 +0000 (13:46 +0000)
# DP: Disable ensurepip for the system installation, only enable it for virtual environments.

# DP: Disable ensurepip for the system installation, only enable it for virtual environments.

Gbp-Pq: Name ensurepip-disabled.diff

Lib/ensurepip/__init__.py
Lib/venv/__init__.py

index 394afc6fcd1dcd366225937c0bce259138e10836..1ace35d419a890f204df16cea8106ada465416f9 100644 (file)
@@ -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=False, user=False,
 
     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")
 
index 8009deb3ea700341bb65e1a84a7838bd80dad852..78042161570be10f1ef444bc0918dbefd9cbe3a5 100644 (file)
@@ -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):
         """