summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYilei Yang <yileiyang@google.com>2023-11-01 21:11:18 (GMT)
committerGitHub <noreply@github.com>2023-11-01 21:11:18 (GMT)
commit834b7c18d74da3b30fdca66cc7da6b9e1db3ce6c (patch)
treefafb01f95bf7efa83da0ff21e90e99a680752038
parent821a7ac493120b6d5065598cfa835ab3f25965cb (diff)
downloadcpython-834b7c18d74da3b30fdca66cc7da6b9e1db3ce6c.zip
cpython-834b7c18d74da3b30fdca66cc7da6b9e1db3ce6c.tar.gz
cpython-834b7c18d74da3b30fdca66cc7da6b9e1db3ce6c.tar.bz2
gh-106718: Treat PyConfig.stdlib_dir as highest-priority setting for stdlib_dir when calculating paths (GH-108730)
-rw-r--r--Lib/test/test_getpath.py14
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2023-08-31-11-42-16.gh-issue-106718._-57DA.rst2
-rw-r--r--Modules/getpath.py24
3 files changed, 30 insertions, 10 deletions
diff --git a/Lib/test/test_getpath.py b/Lib/test/test_getpath.py
index b9cbe1d..2f7aa69 100644
--- a/Lib/test/test_getpath.py
+++ b/Lib/test/test_getpath.py
@@ -818,6 +818,20 @@ class MockGetPathTests(unittest.TestCase):
actual = getpath(ns, expected)
self.assertEqual(expected, actual)
+ def test_explicitly_set_stdlib_dir(self):
+ """Test the explicitly set stdlib_dir in the config is respected."""
+ ns = MockPosixNamespace(
+ PREFIX="/usr",
+ argv0="python",
+ ENV_PATH="/usr/bin",
+ )
+ ns["config"]["stdlib_dir"] = "/custom_stdlib_dir"
+ expected = dict(
+ stdlib_dir="/custom_stdlib_dir",
+ )
+ actual = getpath(ns, expected)
+ self.assertEqual(expected, actual)
+
# ******************************************************************************
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-08-31-11-42-16.gh-issue-106718._-57DA.rst b/Misc/NEWS.d/next/Core and Builtins/2023-08-31-11-42-16.gh-issue-106718._-57DA.rst
new file mode 100644
index 0000000..4c564bb
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2023-08-31-11-42-16.gh-issue-106718._-57DA.rst
@@ -0,0 +1,2 @@
+When PyConfig.stdlib_dir is explicitly set, it's now respected and won't be
+overridden by PyConfig.home.
diff --git a/Modules/getpath.py b/Modules/getpath.py
index 4391a61..1410ffd 100644
--- a/Modules/getpath.py
+++ b/Modules/getpath.py
@@ -229,9 +229,10 @@ use_environment = config.get('use_environment', 1)
pythonpath = config.get('module_search_paths')
pythonpath_was_set = config.get('module_search_paths_set')
+stdlib_dir = config.get('stdlib_dir')
+stdlib_dir_was_set_in_config = bool(stdlib_dir)
real_executable_dir = None
-stdlib_dir = None
platstdlib_dir = None
# ******************************************************************************
@@ -507,11 +508,12 @@ if ((not home_was_set and real_executable_dir and not py_setpath)
build_stdlib_prefix = build_prefix
else:
build_stdlib_prefix = search_up(build_prefix, *BUILDSTDLIB_LANDMARKS)
- # Always use the build prefix for stdlib
- if build_stdlib_prefix:
- stdlib_dir = joinpath(build_stdlib_prefix, 'Lib')
- else:
- stdlib_dir = joinpath(build_prefix, 'Lib')
+ # Use the build prefix for stdlib when not explicitly set
+ if not stdlib_dir_was_set_in_config:
+ if build_stdlib_prefix:
+ stdlib_dir = joinpath(build_stdlib_prefix, 'Lib')
+ else:
+ stdlib_dir = joinpath(build_prefix, 'Lib')
# Only use the build prefix for prefix if it hasn't already been set
if not prefix:
prefix = build_stdlib_prefix
@@ -543,8 +545,9 @@ else:
prefix, had_delim, exec_prefix = home.partition(DELIM)
if not had_delim:
exec_prefix = prefix
- # Reset the standard library directory if it was already set
- stdlib_dir = None
+ # Reset the standard library directory if it was not explicitly set
+ if not stdlib_dir_was_set_in_config:
+ stdlib_dir = None
# First try to detect prefix by looking alongside our runtime library, if known
@@ -560,7 +563,8 @@ else:
if STDLIB_SUBDIR and STDLIB_LANDMARKS and not prefix:
if any(isfile(joinpath(library_dir, f)) for f in STDLIB_LANDMARKS):
prefix = library_dir
- stdlib_dir = joinpath(prefix, STDLIB_SUBDIR)
+ if not stdlib_dir_was_set_in_config:
+ stdlib_dir = joinpath(prefix, STDLIB_SUBDIR)
# Detect prefix by looking for zip file
@@ -571,7 +575,7 @@ else:
prefix = executable_dir
else:
prefix = search_up(executable_dir, ZIP_LANDMARK)
- if prefix:
+ if prefix and not stdlib_dir_was_set_in_config:
stdlib_dir = joinpath(prefix, STDLIB_SUBDIR)
if not isdir(stdlib_dir):
stdlib_dir = None