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
84
85
86
87
|
# DP: Disable ensurepip for the system installation, only enable it for virtual environments.
Index: b/Lib/ensurepip/__init__.py
===================================================================
--- a/Lib/ensurepip/__init__.py
+++ b/Lib/ensurepip/__init__.py
@@ -8,6 +8,34 @@ import tempfile
__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",
@@ -56,6 +84,11 @@ def bootstrap(*, root=None, upgrade=Fals
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: b/Lib/venv/__init__.py
===================================================================
--- a/Lib/venv/__init__.py
+++ b/Lib/venv/__init__.py
@@ -242,7 +242,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):
"""
|