Skip to content

Commit d6fae21

Browse files
committed
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 672bbf2 commit d6fae21

File tree

2 files changed

+40
-14
lines changed

2 files changed

+40
-14
lines changed

Lib/site.py

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

311311
return joinuser("~", ".local")
312312

313+
# Copy of sysconfig.get_platform() but only for MinGW
314+
def _get_platform():
315+
if os.name == 'nt':
316+
if 'gcc' in sys.version.lower():
317+
if 'ucrt' in sys.version.lower():
318+
if 'amd64' in sys.version.lower():
319+
return 'mingw_x86_64_ucrt'
320+
return 'mingw_i686_ucrt'
321+
if 'clang' in sys.version.lower():
322+
if 'amd64' in sys.version.lower():
323+
return 'mingw_x86_64_clang'
324+
if 'arm64' in sys.version.lower():
325+
return 'mingw_aarch64'
326+
if 'arm' in sys.version.lower():
327+
return 'mingw_armv7'
328+
return 'mingw_i686_clang'
329+
if 'amd64' in sys.version.lower():
330+
return 'mingw_x86_64'
331+
return 'mingw_i686'
332+
return sys.platform
313333

314334
# Same to sysconfig.get_path('purelib', os.name+'_user')
315335
def _get_path(userbase):
316336
version = sys.version_info
317337

318-
if os.name == 'nt' and not _POSIX_BUILD:
319-
ver_nodot = sys.winver.replace('.', '')
320-
return f'{userbase}\\Python{ver_nodot}\\site-packages'
338+
if os.name == 'nt':
339+
if not _POSIX_BUILD:
340+
ver_nodot = sys.winver.replace('.', '')
341+
return f'{userbase}\\Python{ver_nodot}\\site-packages'
342+
return f'{userbase}/lib/python{version[0]}.{version[1]}-{_get_platform()}/site-packages'
321343

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

Lib/sysconfig.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -141,20 +141,20 @@ def joinuser(*args):
141141
_INSTALL_SCHEMES |= {
142142
# NOTE: When modifying "purelib" scheme, update site._get_path() too.
143143
'nt_user': {
144-
'stdlib': '{userbase}/lib/python{py_version_short}',
145-
'platstdlib': '{userbase}/lib/python{py_version_short}',
146-
'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
147-
'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
148-
'include': '{userbase}/include/python{py_version_short}',
144+
'stdlib': '{userbase}/lib/python{py_version_short_plat}',
145+
'platstdlib': '{userbase}/lib/python{py_version_short_plat}',
146+
'purelib': '{userbase}/lib/python{py_version_short_plat}/site-packages',
147+
'platlib': '{userbase}/lib/python{py_version_short_plat}/site-packages',
148+
'include': '{userbase}/include/python{py_version_short_plat}',
149149
'scripts': '{userbase}/bin',
150150
'data': '{userbase}',
151151
},
152152
'posix_user': {
153-
'stdlib': '{userbase}/{platlibdir}/python{py_version_short}',
154-
'platstdlib': '{userbase}/{platlibdir}/python{py_version_short}',
155-
'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
156-
'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
157-
'include': '{userbase}/include/python{py_version_short}',
153+
'stdlib': '{userbase}/{platlibdir}/python{py_version_short_plat}',
154+
'platstdlib': '{userbase}/{platlibdir}/python{py_version_short_plat}',
155+
'purelib': '{userbase}/lib/python{py_version_short_plat}/site-packages',
156+
'platlib': '{userbase}/lib/python{py_version_short_plat}/site-packages',
157+
'include': '{userbase}/include/python{py_version_short_plat}',
158158
'scripts': '{userbase}/bin',
159159
'data': '{userbase}',
160160
},
@@ -695,6 +695,10 @@ def _init_config_vars():
695695
_CONFIG_VARS['py_version_nodot_plat'] = sys.winver.replace('.', '')
696696
except AttributeError:
697697
_CONFIG_VARS['py_version_nodot_plat'] = ''
698+
if os.name == 'nt' and _POSIX_BUILD:
699+
_CONFIG_VARS['py_version_short_plat'] = f'{_PY_VERSION_SHORT}-{get_platform()}'
700+
else:
701+
_CONFIG_VARS['py_version_short_plat'] = _PY_VERSION_SHORT
698702

699703
if os.name == 'nt' and not _POSIX_BUILD:
700704
_init_non_posix(_CONFIG_VARS)
@@ -772,7 +776,7 @@ def get_config_var(name):
772776
"""
773777
return get_config_vars().get(name)
774778

775-
779+
# make sure to change site._get_platform() while changing this function
776780
def get_platform():
777781
"""Return a string that identifies the current platform.
778782

0 commit comments

Comments
 (0)