Skip to content

Commit d3af7c3

Browse files
naveen521kklazka
authored andcommitted
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-<platform tag here>`, for example, in CLANG64 this would be `~/.local/lib/python3.10-mingw_x86_64_clang`. Fixes #40
1 parent 864b28b commit d3af7c3

File tree

3 files changed

+43
-16
lines changed

3 files changed

+43
-16
lines changed

Lib/distutils/command/install.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
INSTALL_SCHEMES['nt_user'] = {
7373
'purelib': '$usersite',
7474
'platlib': '$usersite',
75-
'headers': '$userbase/include/python$py_version_short$abiflags/$dist_name',
75+
'headers': '$userbase/include/python$py_version_short_plat$abiflags/$dist_name',
7676
'scripts': '$userbase/bin',
7777
'data' : '$userbase',
7878
}
@@ -81,7 +81,7 @@
8181
'purelib': '$usersite',
8282
'platlib': '$usersite',
8383
'headers':
84-
'$userbase/include/python$py_version_short$abiflags/$dist_name',
84+
'$userbase/include/python$py_version_short_plat$abiflags/$dist_name',
8585
'scripts': '$userbase/bin',
8686
'data' : '$userbase',
8787
}
@@ -311,6 +311,7 @@ def finalize_options(self):
311311
'py_version': py_version,
312312
'py_version_short': '%d.%d' % sys.version_info[:2],
313313
'py_version_nodot': '%d%d' % sys.version_info[:2],
314+
'py_version_short_plat': f'{sys.version_info[0]}.{sys.version_info[1]}-{get_platform()}' if os.name == 'nt' and 'gcc' in sys.version.lower() else f'{sys.version_info[0]}.{sys.version_info[1]}',
314315
'sys_prefix': prefix,
315316
'prefix': prefix,
316317
'sys_exec_prefix': exec_prefix,

Lib/site.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -289,14 +289,36 @@ def joinuser(*args):
289289

290290
return joinuser("~", ".local")
291291

292+
# Copy of sysconfig.get_platform() but only for MinGW
293+
def _get_platform():
294+
if os.name == 'nt':
295+
if 'gcc' in sys.version.lower():
296+
if 'ucrt' in sys.version.lower():
297+
if 'amd64' in sys.version.lower():
298+
return 'mingw_x86_64_ucrt'
299+
return 'mingw_i686_ucrt'
300+
if 'clang' in sys.version.lower():
301+
if 'amd64' in sys.version.lower():
302+
return 'mingw_x86_64_clang'
303+
if 'arm64' in sys.version.lower():
304+
return 'mingw_aarch64'
305+
if 'arm' in sys.version.lower():
306+
return 'mingw_armv7'
307+
return 'mingw_i686_clang'
308+
if 'amd64' in sys.version.lower():
309+
return 'mingw_x86_64'
310+
return 'mingw_i686'
311+
return sys.platform
292312

293313
# Same to sysconfig.get_path('purelib', os.name+'_user')
294314
def _get_path(userbase):
295315
version = sys.version_info
296316

297-
if os.name == 'nt' and not _POSIX_BUILD:
298-
ver_nodot = sys.winver.replace('.', '')
299-
return f'{userbase}\\Python{ver_nodot}\\site-packages'
317+
if os.name == 'nt':
318+
if not _POSIX_BUILD:
319+
ver_nodot = sys.winver.replace('.', '')
320+
return f'{userbase}\\Python{ver_nodot}\\site-packages'
321+
return f'{userbase}/lib/python{version[0]}.{version[1]}-{_get_platform()}/site-packages'
300322

301323
if sys.platform == 'darwin' and sys._framework:
302324
return f'{userbase}/lib/python/site-packages'

Lib/sysconfig.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -95,20 +95,20 @@ def joinuser(*args):
9595
_INSTALL_SCHEMES |= {
9696
# NOTE: When modifying "purelib" scheme, update site._get_path() too.
9797
'nt_user': {
98-
'stdlib': '{userbase}/lib/python{py_version_short}',
99-
'platstdlib': '{userbase}/lib/python{py_version_short}',
100-
'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
101-
'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
102-
'include': '{userbase}/include/python{py_version_short}',
98+
'stdlib': '{userbase}/lib/python{py_version_short_plat}',
99+
'platstdlib': '{userbase}/lib/python{py_version_short_plat}',
100+
'purelib': '{userbase}/lib/python{py_version_short_plat}/site-packages',
101+
'platlib': '{userbase}/lib/python{py_version_short_plat}/site-packages',
102+
'include': '{userbase}/include/python{py_version_short_plat}',
103103
'scripts': '{userbase}/bin',
104104
'data': '{userbase}',
105105
},
106106
'posix_user': {
107-
'stdlib': '{userbase}/{platlibdir}/python{py_version_short}',
108-
'platstdlib': '{userbase}/{platlibdir}/python{py_version_short}',
109-
'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
110-
'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
111-
'include': '{userbase}/include/python{py_version_short}',
107+
'stdlib': '{userbase}/{platlibdir}/python{py_version_short_plat}',
108+
'platstdlib': '{userbase}/{platlibdir}/python{py_version_short_plat}',
109+
'purelib': '{userbase}/lib/python{py_version_short_plat}/site-packages',
110+
'platlib': '{userbase}/lib/python{py_version_short_plat}/site-packages',
111+
'include': '{userbase}/include/python{py_version_short_plat}',
112112
'scripts': '{userbase}/bin',
113113
'data': '{userbase}',
114114
},
@@ -640,6 +640,10 @@ def get_config_vars(*args):
640640
_CONFIG_VARS['py_version_nodot_plat'] = sys.winver.replace('.', '')
641641
except AttributeError:
642642
_CONFIG_VARS['py_version_nodot_plat'] = ''
643+
if os.name == 'nt' and _POSIX_BUILD:
644+
_CONFIG_VARS['py_version_short_plat'] = f'{_PY_VERSION_SHORT}-{get_platform()}'
645+
else:
646+
_CONFIG_VARS['py_version_short_plat'] = _PY_VERSION_SHORT
643647

644648
if os.name == 'nt' and not _POSIX_BUILD:
645649
_init_non_posix(_CONFIG_VARS)
@@ -698,7 +702,7 @@ def get_config_var(name):
698702
warnings.warn('SO is deprecated, use EXT_SUFFIX', DeprecationWarning, 2)
699703
return get_config_vars().get(name)
700704

701-
705+
# make sure to change site._get_platform() while changing this function
702706
def get_platform():
703707
"""Return a string that identifies the current platform.
704708

0 commit comments

Comments
 (0)