From e7fb3ba2e34ca4a202616b7fe6e95816111f2b95 Mon Sep 17 00:00:00 2001 From: Naveen M K Date: Wed, 19 Jan 2022 20:01:45 +0530 Subject: [PATCH] Change user site-packages path to include the environment info This should avoid mixing of user site-packages between python from various environments. Previously, the user site-packages should be located at `~/.local/lib/python3.10` for all environment including 32-bits variants which caused problems with 64-bit trying to load 32-bit extensions. Now this path will be changed to `~/.local/lib/python3.10-`, for example, in CLANG64 this would be `~/.local/lib/python3.10-mingw_x86_64_clang`. Fixes https://github.com/msys2-contrib/cpython-mingw/issues/40 --- Lib/site.py | 28 +++++++++++++++++++++++++--- Lib/sysconfig/__init__.py | 26 +++++++++++++++----------- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/Lib/site.py b/Lib/site.py index 8ab4b465b9442a..0317e71f2f9473 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -314,6 +314,26 @@ def joinuser(*args): return joinuser("~", ".local") +# Copy of sysconfig.get_platform() but only for MinGW +def _get_platform(): + if os.name == 'nt': + if 'gcc' in sys.version.lower(): + if 'ucrt' in sys.version.lower(): + if 'amd64' in sys.version.lower(): + return 'mingw_x86_64_ucrt' + return 'mingw_i686_ucrt' + if 'clang' in sys.version.lower(): + if 'amd64' in sys.version.lower(): + return 'mingw_x86_64_clang' + if 'arm64' in sys.version.lower(): + return 'mingw_aarch64' + if 'arm' in sys.version.lower(): + return 'mingw_armv7' + return 'mingw_i686_clang' + if 'amd64' in sys.version.lower(): + return 'mingw_x86_64' + return 'mingw_i686' + return sys.platform # Same to sysconfig.get_path('purelib', os.name+'_user') def _get_path(userbase): @@ -325,9 +345,11 @@ def _get_path(userbase): implementation = _get_implementation() implementation_lower = implementation.lower() - if os.name == 'nt' and not _POSIX_BUILD: - ver_nodot = sys.winver.replace('.', '') - return f'{userbase}\\{implementation}{ver_nodot}\\site-packages' + if os.name == 'nt': + if not _POSIX_BUILD: + ver_nodot = sys.winver.replace('.', '') + return f'{userbase}\\{implementation}{ver_nodot}\\site-packages' + return f'{userbase}/lib/{implementation_lower}{version[0]}.{version[1]}-{_get_platform()}{abi_thread}/site-packages' if sys.platform == 'darwin' and sys._framework: return f'{userbase}/lib/{implementation_lower}/site-packages' diff --git a/Lib/sysconfig/__init__.py b/Lib/sysconfig/__init__.py index afe71cfad8c1a0..48a1edd876f500 100644 --- a/Lib/sysconfig/__init__.py +++ b/Lib/sysconfig/__init__.py @@ -144,20 +144,20 @@ def joinuser(*args): _INSTALL_SCHEMES |= { # NOTE: When modifying "purelib" scheme, update site._get_path() too. 'nt_user': { - 'stdlib': '{userbase}/lib/{implementation}{py_version_short}{abi_thread}', - 'platstdlib': '{userbase}/lib/{implementation}{py_version_short}{abi_thread}', - 'purelib': '{userbase}/lib/{implementation}{py_version_short}{abi_thread}/site-packages', - 'platlib': '{userbase}/lib/{implementation}{py_version_short}{abi_thread}/site-packages', - 'include': '{userbase}/include/{implementation}{py_version_short}{abi_thread}', + 'stdlib': '{userbase}/lib/{implementation}{py_version_short_plat}{abi_thread}', + 'platstdlib': '{userbase}/lib/{implementation}{py_version_short_plat}{abi_thread}', + 'purelib': '{userbase}/lib/{implementation}{py_version_short_plat}{abi_thread}/site-packages', + 'platlib': '{userbase}/lib/{implementation}{py_version_short_plat}{abi_thread}/site-packages', + 'include': '{userbase}/include/{implementation}{py_version_short_plat}{abi_thread}', 'scripts': '{userbase}/bin', 'data': '{userbase}', }, 'posix_user': { - 'stdlib': '{userbase}/{platlibdir}/{implementation_lower}{py_version_short}{abi_thread}', - 'platstdlib': '{userbase}/{platlibdir}/{implementation_lower}{py_version_short}{abi_thread}', - 'purelib': '{userbase}/lib/{implementation_lower}{py_version_short}{abi_thread}/site-packages', - 'platlib': '{userbase}/lib/{implementation_lower}{py_version_short}{abi_thread}/site-packages', - 'include': '{userbase}/include/{implementation_lower}{py_version_short}{abi_thread}', + 'stdlib': '{userbase}/{platlibdir}/{implementation_lower}{py_version_short_plat}{abi_thread}', + 'platstdlib': '{userbase}/{platlibdir}/{implementation_lower}{py_version_short_plat}{abi_thread}', + 'purelib': '{userbase}/lib/{implementation_lower}{py_version_short_plat}{abi_thread}/site-packages', + 'platlib': '{userbase}/lib/{implementation_lower}{py_version_short_plat}{abi_thread}/site-packages', + 'include': '{userbase}/include/{implementation_lower}{py_version_short_plat}{abi_thread}', 'scripts': '{userbase}/bin', 'data': '{userbase}', }, @@ -493,6 +493,10 @@ def _init_config_vars(): _CONFIG_VARS['py_version_nodot_plat'] = sys.winver.replace('.', '') except AttributeError: _CONFIG_VARS['py_version_nodot_plat'] = '' + if os.name == 'nt' and _POSIX_BUILD: + _CONFIG_VARS['py_version_short_plat'] = f'{_PY_VERSION_SHORT}-{get_platform()}' + else: + _CONFIG_VARS['py_version_short_plat'] = _PY_VERSION_SHORT if os.name == 'nt' and not _POSIX_BUILD: _init_non_posix(_CONFIG_VARS) @@ -583,7 +587,7 @@ def get_config_var(name): """ return get_config_vars().get(name) - +# make sure to change site._get_platform() while changing this function def get_platform(): """Return a string that identifies the current platform.