summaryrefslogtreecommitdiffstats
path: root/Lib/sysconfig.py
diff options
context:
space:
mode:
authorMiro HronĨok <miro@hroncok.cz>2022-03-18 09:53:29 (GMT)
committerGitHub <noreply@github.com>2022-03-18 09:53:29 (GMT)
commit48d926269963cfe7a49c0a4f34af4fe9b832399b (patch)
treed3fc5c6c1e6b8db9f95eb0fa1987c2738985f654 /Lib/sysconfig.py
parentcd44afc573e2e2de8d7e5a9119c347373066cd10 (diff)
downloadcpython-48d926269963cfe7a49c0a4f34af4fe9b832399b.zip
cpython-48d926269963cfe7a49c0a4f34af4fe9b832399b.tar.gz
cpython-48d926269963cfe7a49c0a4f34af4fe9b832399b.tar.bz2
bpo-45413: Define "posix_venv", "nt_venv" and "venv" sysconfig installation schemes (GH-31034)
Define *posix_venv* and *nt_venv* sysconfig installation schemes to be used for bootstrapping new virtual environments. Add *venv* sysconfig installation scheme to get the appropriate one of the above. The schemes are identical to the pre-existing *posix_prefix* and *nt* install schemes. The venv module now uses the *venv* scheme to create new virtual environments instead of hardcoding the paths depending only on the platform. Downstream Python distributors customizing the *posix_prefix* or *nt* install scheme in a way that is not compatible with the install scheme used in virtual environments are encouraged not to customize the *venv* schemes. When Python itself runs in a virtual environment, sysconfig.get_default_scheme and sysconfig.get_preferred_scheme with `key="prefix"` returns *venv*.
Diffstat (limited to 'Lib/sysconfig.py')
-rw-r--r--Lib/sysconfig.py47
1 files changed, 47 insertions, 0 deletions
diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
index d4a8a68..2a01342 100644
--- a/Lib/sysconfig.py
+++ b/Lib/sysconfig.py
@@ -56,8 +56,53 @@ _INSTALL_SCHEMES = {
'scripts': '{base}/Scripts',
'data': '{base}',
},
+ # Downstream distributors can overwrite the default install scheme.
+ # This is done to support downstream modifications where distributors change
+ # the installation layout (eg. different site-packages directory).
+ # So, distributors will change the default scheme to one that correctly
+ # represents their layout.
+ # This presents an issue for projects/people that need to bootstrap virtual
+ # environments, like virtualenv. As distributors might now be customizing
+ # the default install scheme, there is no guarantee that the information
+ # returned by sysconfig.get_default_scheme/get_paths is correct for
+ # a virtual environment, the only guarantee we have is that it is correct
+ # for the *current* environment. When bootstrapping a virtual environment,
+ # we need to know its layout, so that we can place the files in the
+ # correct locations.
+ # The "*_venv" install scheme is a scheme to bootstrap virtual environments,
+ # essentially identical to the default posix_prefix/nt schemes.
+ # Downstream distributors who patch posix_prefix/nt scheme are encouraged to
+ # leave the following schemes unchanged
+ 'posix_venv': {
+ 'stdlib': '{installed_base}/{platlibdir}/python{py_version_short}',
+ 'platstdlib': '{platbase}/{platlibdir}/python{py_version_short}',
+ 'purelib': '{base}/lib/python{py_version_short}/site-packages',
+ 'platlib': '{platbase}/{platlibdir}/python{py_version_short}/site-packages',
+ 'include':
+ '{installed_base}/include/python{py_version_short}{abiflags}',
+ 'platinclude':
+ '{installed_platbase}/include/python{py_version_short}{abiflags}',
+ 'scripts': '{base}/bin',
+ 'data': '{base}',
+ },
+ 'nt_venv': {
+ 'stdlib': '{installed_base}/Lib',
+ 'platstdlib': '{base}/Lib',
+ 'purelib': '{base}/Lib/site-packages',
+ 'platlib': '{base}/Lib/site-packages',
+ 'include': '{installed_base}/Include',
+ 'platinclude': '{installed_base}/Include',
+ 'scripts': '{base}/Scripts',
+ 'data': '{base}',
+ },
}
+# For the OS-native venv scheme, we essentially provide an alias:
+if os.name == 'nt':
+ _INSTALL_SCHEMES['venv'] = _INSTALL_SCHEMES['nt_venv']
+else:
+ _INSTALL_SCHEMES['venv'] = _INSTALL_SCHEMES['posix_venv']
+
# NOTE: site.py has copy of this function.
# Sync it when modify this function.
@@ -251,6 +296,8 @@ def _get_preferred_schemes():
def get_preferred_scheme(key):
+ if key == 'prefix' and sys.prefix != sys.base_prefix:
+ return 'venv'
scheme = _get_preferred_schemes()[key]
if scheme not in _INSTALL_SCHEMES:
raise ValueError(