gh-103708: Make directory layout in sysconfig implementation configurable (#103709)

This commit is contained in:
Ankit Kumar Pandey 2023-12-29 23:25:17 +05:30 committed by GitHub
parent cf34b7704b
commit f46987b828
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 52 additions and 39 deletions

View file

@ -260,6 +260,10 @@ def check_enableusersite():
# #
# See https://bugs.python.org/issue29585 # See https://bugs.python.org/issue29585
# Copy of sysconfig._get_implementation()
def _get_implementation():
return 'Python'
# Copy of sysconfig._getuserbase() # Copy of sysconfig._getuserbase()
def _getuserbase(): def _getuserbase():
env_base = os.environ.get("PYTHONUSERBASE", None) env_base = os.environ.get("PYTHONUSERBASE", None)
@ -275,7 +279,7 @@ def joinuser(*args):
if os.name == "nt": if os.name == "nt":
base = os.environ.get("APPDATA") or "~" base = os.environ.get("APPDATA") or "~"
return joinuser(base, "Python") return joinuser(base, _get_implementation())
if sys.platform == "darwin" and sys._framework: if sys.platform == "darwin" and sys._framework:
return joinuser("~", "Library", sys._framework, return joinuser("~", "Library", sys._framework,
@ -288,12 +292,14 @@ def joinuser(*args):
def _get_path(userbase): def _get_path(userbase):
version = sys.version_info version = sys.version_info
implementation = _get_implementation()
implementation_lower = implementation.lower()
if os.name == 'nt': if os.name == 'nt':
ver_nodot = sys.winver.replace('.', '') ver_nodot = sys.winver.replace('.', '')
return f'{userbase}\\Python{ver_nodot}\\site-packages' return f'{userbase}\\{implementation}{ver_nodot}\\site-packages'
if sys.platform == 'darwin' and sys._framework: if sys.platform == 'darwin' and sys._framework:
return f'{userbase}/lib/python/site-packages' return f'{userbase}/lib/{implementation_lower}/site-packages'
return f'{userbase}/lib/python{version[0]}.{version[1]}/site-packages' return f'{userbase}/lib/python{version[0]}.{version[1]}/site-packages'
@ -361,6 +367,8 @@ def getsitepackages(prefixes=None):
continue continue
seen.add(prefix) seen.add(prefix)
implementation = _get_implementation().lower()
ver = sys.version_info
if os.sep == '/': if os.sep == '/':
libdirs = [sys.platlibdir] libdirs = [sys.platlibdir]
if sys.platlibdir != "lib": if sys.platlibdir != "lib":
@ -368,7 +376,7 @@ def getsitepackages(prefixes=None):
for libdir in libdirs: for libdir in libdirs:
path = os.path.join(prefix, libdir, path = os.path.join(prefix, libdir,
"python%d.%d" % sys.version_info[:2], f"{implementation}{ver[0]}.{ver[1]}",
"site-packages") "site-packages")
sitepackages.append(path) sitepackages.append(path)
else: else:

View file

@ -26,24 +26,24 @@
_INSTALL_SCHEMES = { _INSTALL_SCHEMES = {
'posix_prefix': { 'posix_prefix': {
'stdlib': '{installed_base}/{platlibdir}/python{py_version_short}', 'stdlib': '{installed_base}/{platlibdir}/{implementation_lower}{py_version_short}',
'platstdlib': '{platbase}/{platlibdir}/python{py_version_short}', 'platstdlib': '{platbase}/{platlibdir}/{implementation_lower}{py_version_short}',
'purelib': '{base}/lib/python{py_version_short}/site-packages', 'purelib': '{base}/lib/{implementation_lower}{py_version_short}/site-packages',
'platlib': '{platbase}/{platlibdir}/python{py_version_short}/site-packages', 'platlib': '{platbase}/{platlibdir}/{implementation_lower}{py_version_short}/site-packages',
'include': 'include':
'{installed_base}/include/python{py_version_short}{abiflags}', '{installed_base}/include/{implementation_lower}{py_version_short}{abiflags}',
'platinclude': 'platinclude':
'{installed_platbase}/include/python{py_version_short}{abiflags}', '{installed_platbase}/include/{implementation_lower}{py_version_short}{abiflags}',
'scripts': '{base}/bin', 'scripts': '{base}/bin',
'data': '{base}', 'data': '{base}',
}, },
'posix_home': { 'posix_home': {
'stdlib': '{installed_base}/lib/python', 'stdlib': '{installed_base}/lib/{implementation_lower}',
'platstdlib': '{base}/lib/python', 'platstdlib': '{base}/lib/{implementation_lower}',
'purelib': '{base}/lib/python', 'purelib': '{base}/lib/{implementation_lower}',
'platlib': '{base}/lib/python', 'platlib': '{base}/lib/{implementation_lower}',
'include': '{installed_base}/include/python', 'include': '{installed_base}/include/{implementation_lower}',
'platinclude': '{installed_base}/include/python', 'platinclude': '{installed_base}/include/{implementation_lower}',
'scripts': '{base}/bin', 'scripts': '{base}/bin',
'data': '{base}', 'data': '{base}',
}, },
@ -75,14 +75,14 @@
# Downstream distributors who patch posix_prefix/nt scheme are encouraged to # Downstream distributors who patch posix_prefix/nt scheme are encouraged to
# leave the following schemes unchanged # leave the following schemes unchanged
'posix_venv': { 'posix_venv': {
'stdlib': '{installed_base}/{platlibdir}/python{py_version_short}', 'stdlib': '{installed_base}/{platlibdir}/{implementation_lower}{py_version_short}',
'platstdlib': '{platbase}/{platlibdir}/python{py_version_short}', 'platstdlib': '{platbase}/{platlibdir}/{implementation_lower}{py_version_short}',
'purelib': '{base}/lib/python{py_version_short}/site-packages', 'purelib': '{base}/lib/{implementation_lower}{py_version_short}/site-packages',
'platlib': '{platbase}/{platlibdir}/python{py_version_short}/site-packages', 'platlib': '{platbase}/{platlibdir}/{implementation_lower}{py_version_short}/site-packages',
'include': 'include':
'{installed_base}/include/python{py_version_short}{abiflags}', '{installed_base}/include/{implementation_lower}{py_version_short}{abiflags}',
'platinclude': 'platinclude':
'{installed_platbase}/include/python{py_version_short}{abiflags}', '{installed_platbase}/include/{implementation_lower}{py_version_short}{abiflags}',
'scripts': '{base}/bin', 'scripts': '{base}/bin',
'data': '{base}', 'data': '{base}',
}, },
@ -104,6 +104,8 @@
else: else:
_INSTALL_SCHEMES['venv'] = _INSTALL_SCHEMES['posix_venv'] _INSTALL_SCHEMES['venv'] = _INSTALL_SCHEMES['posix_venv']
def _get_implementation():
return 'Python'
# NOTE: site.py has copy of this function. # NOTE: site.py has copy of this function.
# Sync it when modify this function. # Sync it when modify this function.
@ -121,7 +123,7 @@ def joinuser(*args):
if os.name == "nt": if os.name == "nt":
base = os.environ.get("APPDATA") or "~" base = os.environ.get("APPDATA") or "~"
return joinuser(base, "Python") return joinuser(base, _get_implementation())
if sys.platform == "darwin" and sys._framework: if sys.platform == "darwin" and sys._framework:
return joinuser("~", "Library", sys._framework, return joinuser("~", "Library", sys._framework,
@ -135,29 +137,29 @@ def joinuser(*args):
_INSTALL_SCHEMES |= { _INSTALL_SCHEMES |= {
# NOTE: When modifying "purelib" scheme, update site._get_path() too. # NOTE: When modifying "purelib" scheme, update site._get_path() too.
'nt_user': { 'nt_user': {
'stdlib': '{userbase}/Python{py_version_nodot_plat}', 'stdlib': '{userbase}/{implementation}{py_version_nodot_plat}',
'platstdlib': '{userbase}/Python{py_version_nodot_plat}', 'platstdlib': '{userbase}/{implementation}{py_version_nodot_plat}',
'purelib': '{userbase}/Python{py_version_nodot_plat}/site-packages', 'purelib': '{userbase}/{implementation}{py_version_nodot_plat}/site-packages',
'platlib': '{userbase}/Python{py_version_nodot_plat}/site-packages', 'platlib': '{userbase}/{implementation}{py_version_nodot_plat}/site-packages',
'include': '{userbase}/Python{py_version_nodot_plat}/Include', 'include': '{userbase}/{implementation}{py_version_nodot_plat}/Include',
'scripts': '{userbase}/Python{py_version_nodot_plat}/Scripts', 'scripts': '{userbase}/{implementation}{py_version_nodot_plat}/Scripts',
'data': '{userbase}', 'data': '{userbase}',
}, },
'posix_user': { 'posix_user': {
'stdlib': '{userbase}/{platlibdir}/python{py_version_short}', 'stdlib': '{userbase}/{platlibdir}/{implementation_lower}{py_version_short}',
'platstdlib': '{userbase}/{platlibdir}/python{py_version_short}', 'platstdlib': '{userbase}/{platlibdir}/{implementation_lower}{py_version_short}',
'purelib': '{userbase}/lib/python{py_version_short}/site-packages', 'purelib': '{userbase}/lib/{implementation_lower}{py_version_short}/site-packages',
'platlib': '{userbase}/lib/python{py_version_short}/site-packages', 'platlib': '{userbase}/lib/{implementation_lower}{py_version_short}/site-packages',
'include': '{userbase}/include/python{py_version_short}', 'include': '{userbase}/include/{implementation_lower}{py_version_short}',
'scripts': '{userbase}/bin', 'scripts': '{userbase}/bin',
'data': '{userbase}', 'data': '{userbase}',
}, },
'osx_framework_user': { 'osx_framework_user': {
'stdlib': '{userbase}/lib/python', 'stdlib': '{userbase}/lib/{implementation_lower}',
'platstdlib': '{userbase}/lib/python', 'platstdlib': '{userbase}/lib/{implementation_lower}',
'purelib': '{userbase}/lib/python/site-packages', 'purelib': '{userbase}/lib/{implementation_lower}/site-packages',
'platlib': '{userbase}/lib/python/site-packages', 'platlib': '{userbase}/lib/{implementation_lower}/site-packages',
'include': '{userbase}/include/python{py_version_short}', 'include': '{userbase}/include/{implementation_lower}{py_version_short}',
'scripts': '{userbase}/bin', 'scripts': '{userbase}/bin',
'data': '{userbase}', 'data': '{userbase}',
}, },
@ -459,6 +461,8 @@ def _init_config_vars():
_CONFIG_VARS['platbase'] = _EXEC_PREFIX _CONFIG_VARS['platbase'] = _EXEC_PREFIX
_CONFIG_VARS['projectbase'] = _PROJECT_BASE _CONFIG_VARS['projectbase'] = _PROJECT_BASE
_CONFIG_VARS['platlibdir'] = sys.platlibdir _CONFIG_VARS['platlibdir'] = sys.platlibdir
_CONFIG_VARS['implementation'] = _get_implementation()
_CONFIG_VARS['implementation_lower'] = _get_implementation().lower()
try: try:
_CONFIG_VARS['abiflags'] = sys.abiflags _CONFIG_VARS['abiflags'] = sys.abiflags
except AttributeError: except AttributeError:

View file

@ -0,0 +1 @@
Make hardcoded python name, a configurable parameter so that different implementations of python can override it instead of making huge diffs in sysconfig.py