comparison lib/python3.8/site-packages/pip/_internal/utils/virtualenv.py @ 1:64071f2a4cf0 draft default tip

Deleted selected files
author guerler
date Mon, 27 Jul 2020 03:55:49 -0400
parents 9e54283cc701
children
comparison
equal deleted inserted replaced
0:9e54283cc701 1:64071f2a4cf0
1 from __future__ import absolute_import
2
3 import logging
4 import os
5 import re
6 import site
7 import sys
8
9 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
10
11 if MYPY_CHECK_RUNNING:
12 from typing import List, Optional
13
14 logger = logging.getLogger(__name__)
15 _INCLUDE_SYSTEM_SITE_PACKAGES_REGEX = re.compile(
16 r"include-system-site-packages\s*=\s*(?P<value>true|false)"
17 )
18
19
20 def _running_under_venv():
21 # type: () -> bool
22 """Checks if sys.base_prefix and sys.prefix match.
23
24 This handles PEP 405 compliant virtual environments.
25 """
26 return sys.prefix != getattr(sys, "base_prefix", sys.prefix)
27
28
29 def _running_under_regular_virtualenv():
30 # type: () -> bool
31 """Checks if sys.real_prefix is set.
32
33 This handles virtual environments created with pypa's virtualenv.
34 """
35 # pypa/virtualenv case
36 return hasattr(sys, 'real_prefix')
37
38
39 def running_under_virtualenv():
40 # type: () -> bool
41 """Return True if we're running inside a virtualenv, False otherwise.
42 """
43 return _running_under_venv() or _running_under_regular_virtualenv()
44
45
46 def _get_pyvenv_cfg_lines():
47 # type: () -> Optional[List[str]]
48 """Reads {sys.prefix}/pyvenv.cfg and returns its contents as list of lines
49
50 Returns None, if it could not read/access the file.
51 """
52 pyvenv_cfg_file = os.path.join(sys.prefix, 'pyvenv.cfg')
53 try:
54 with open(pyvenv_cfg_file) as f:
55 return f.read().splitlines() # avoids trailing newlines
56 except IOError:
57 return None
58
59
60 def _no_global_under_venv():
61 # type: () -> bool
62 """Check `{sys.prefix}/pyvenv.cfg` for system site-packages inclusion
63
64 PEP 405 specifies that when system site-packages are not supposed to be
65 visible from a virtual environment, `pyvenv.cfg` must contain the following
66 line:
67
68 include-system-site-packages = false
69
70 Additionally, log a warning if accessing the file fails.
71 """
72 cfg_lines = _get_pyvenv_cfg_lines()
73 if cfg_lines is None:
74 # We're not in a "sane" venv, so assume there is no system
75 # site-packages access (since that's PEP 405's default state).
76 logger.warning(
77 "Could not access 'pyvenv.cfg' despite a virtual environment "
78 "being active. Assuming global site-packages is not accessible "
79 "in this environment."
80 )
81 return True
82
83 for line in cfg_lines:
84 match = _INCLUDE_SYSTEM_SITE_PACKAGES_REGEX.match(line)
85 if match is not None and match.group('value') == 'false':
86 return True
87 return False
88
89
90 def _no_global_under_regular_virtualenv():
91 # type: () -> bool
92 """Check if "no-global-site-packages.txt" exists beside site.py
93
94 This mirrors logic in pypa/virtualenv for determining whether system
95 site-packages are visible in the virtual environment.
96 """
97 site_mod_dir = os.path.dirname(os.path.abspath(site.__file__))
98 no_global_site_packages_file = os.path.join(
99 site_mod_dir, 'no-global-site-packages.txt',
100 )
101 return os.path.exists(no_global_site_packages_file)
102
103
104 def virtualenv_no_global():
105 # type: () -> bool
106 """Returns a boolean, whether running in venv with no system site-packages.
107 """
108
109 if _running_under_regular_virtualenv():
110 return _no_global_under_regular_virtualenv()
111
112 if _running_under_venv():
113 return _no_global_under_venv()
114
115 return False