summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorFilipe Laíns 🇵🇸 <lains@riseup.net>2024-12-08 05:57:22 (GMT)
committerGitHub <noreply@github.com>2024-12-08 05:57:22 (GMT)
commit70154855cf698560dd9a5e484a649839cd68dc7c (patch)
tree1b6ec9a01bd0bd679ba5370ef62d745f3f5fd03a /Lib
parent79b7cab50a3292a1c01466cf0e69fb7b4e56cfb1 (diff)
downloadcpython-70154855cf698560dd9a5e484a649839cd68dc7c.zip
cpython-70154855cf698560dd9a5e484a649839cd68dc7c.tar.gz
cpython-70154855cf698560dd9a5e484a649839cd68dc7c.tar.bz2
GH-126789: fix some sysconfig data on late site initializations (#127729)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/sysconfig/__init__.py18
-rw-r--r--Lib/test/test_sysconfig.py25
2 files changed, 38 insertions, 5 deletions
diff --git a/Lib/sysconfig/__init__.py b/Lib/sysconfig/__init__.py
index ad86609..ed7b6a3 100644
--- a/Lib/sysconfig/__init__.py
+++ b/Lib/sysconfig/__init__.py
@@ -173,9 +173,7 @@ _SCHEME_KEYS = ('stdlib', 'platstdlib', 'purelib', 'platlib', 'include',
_PY_VERSION = sys.version.split()[0]
_PY_VERSION_SHORT = f'{sys.version_info[0]}.{sys.version_info[1]}'
_PY_VERSION_SHORT_NO_DOT = f'{sys.version_info[0]}{sys.version_info[1]}'
-_PREFIX = os.path.normpath(sys.prefix)
_BASE_PREFIX = os.path.normpath(sys.base_prefix)
-_EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
_BASE_EXEC_PREFIX = os.path.normpath(sys.base_exec_prefix)
# Mutex guarding initialization of _CONFIG_VARS.
_CONFIG_VARS_LOCK = threading.RLock()
@@ -473,8 +471,8 @@ def _init_config_vars():
global _CONFIG_VARS
_CONFIG_VARS = {}
- prefix = _PREFIX
- exec_prefix = _EXEC_PREFIX
+ prefix = os.path.normpath(sys.prefix)
+ exec_prefix = os.path.normpath(sys.exec_prefix)
base_prefix = _BASE_PREFIX
base_exec_prefix = _BASE_EXEC_PREFIX
@@ -564,9 +562,19 @@ def get_config_vars(*args):
With arguments, return a list of values that result from looking up
each argument in the configuration variable dictionary.
"""
+ global _CONFIG_VARS_INITIALIZED
# Avoid claiming the lock once initialization is complete.
- if not _CONFIG_VARS_INITIALIZED:
+ if _CONFIG_VARS_INITIALIZED:
+ # GH-126789: If sys.prefix or sys.exec_prefix were updated, invalidate the cache.
+ prefix = os.path.normpath(sys.prefix)
+ exec_prefix = os.path.normpath(sys.exec_prefix)
+ if _CONFIG_VARS['prefix'] != prefix or _CONFIG_VARS['exec_prefix'] != exec_prefix:
+ with _CONFIG_VARS_LOCK:
+ _CONFIG_VARS_INITIALIZED = False
+ _init_config_vars()
+ else:
+ # Initialize the config_vars cache.
with _CONFIG_VARS_LOCK:
# Test again with the lock held to avoid races. Note that
# we test _CONFIG_VARS here, not _CONFIG_VARS_INITIALIZED,
diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py
index 0df1a67..ce504dc 100644
--- a/Lib/test/test_sysconfig.py
+++ b/Lib/test/test_sysconfig.py
@@ -53,6 +53,8 @@ class TestSysConfig(unittest.TestCase):
os.uname = self._get_uname
# saving the environment
self.name = os.name
+ self.prefix = sys.prefix
+ self.exec_prefix = sys.exec_prefix
self.platform = sys.platform
self.version = sys.version
self._framework = sys._framework
@@ -77,6 +79,8 @@ class TestSysConfig(unittest.TestCase):
else:
del os.uname
os.name = self.name
+ sys.prefix = self.prefix
+ sys.exec_prefix = self.exec_prefix
sys.platform = self.platform
sys.version = self.version
sys._framework = self._framework
@@ -653,6 +657,27 @@ class TestSysConfig(unittest.TestCase):
self.assertEqual(system_config_vars, json_config_vars)
+ def test_sysconfig_config_vars_no_prefix_cache(self):
+ sys.prefix = 'prefix-AAA'
+ sys.exec_prefix = 'exec-prefix-AAA'
+
+ config_vars = sysconfig.get_config_vars()
+
+ self.assertEqual(config_vars['prefix'], sys.prefix)
+ self.assertEqual(config_vars['base'], sys.prefix)
+ self.assertEqual(config_vars['exec_prefix'], sys.exec_prefix)
+ self.assertEqual(config_vars['platbase'], sys.exec_prefix)
+
+ sys.prefix = 'prefix-BBB'
+ sys.exec_prefix = 'exec-prefix-BBB'
+
+ config_vars = sysconfig.get_config_vars()
+
+ self.assertEqual(config_vars['prefix'], sys.prefix)
+ self.assertEqual(config_vars['base'], sys.prefix)
+ self.assertEqual(config_vars['exec_prefix'], sys.exec_prefix)
+ self.assertEqual(config_vars['platbase'], sys.exec_prefix)
+
class MakefileTests(unittest.TestCase):