Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
hhhrrrttt222111
GitHub Repository: hhhrrrttt222111/Dorkify
Path: blob/master/venv/Lib/site-packages/pip/_internal/utils/virtualenv.py
811 views
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
# PEP 405 compliance needs to be checked first since virtualenv >=20 would
109
# return True for both checks, but is only able to use the PEP 405 config.
110
if _running_under_venv():
111
return _no_global_under_venv()
112
113
if _running_under_regular_virtualenv():
114
return _no_global_under_regular_virtualenv()
115
116
return False
117
118