]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-106718: Treat PyConfig.stdlib_dir as highest-priority setting for stdlib_dir when...
authorYilei Yang <yileiyang@google.com>
Wed, 1 Nov 2023 21:11:18 +0000 (14:11 -0700)
committerGitHub <noreply@github.com>
Wed, 1 Nov 2023 21:11:18 +0000 (21:11 +0000)
Lib/test/test_getpath.py
Misc/NEWS.d/next/Core and Builtins/2023-08-31-11-42-16.gh-issue-106718._-57DA.rst [new file with mode: 0644]
Modules/getpath.py

index b9cbe1d92c436f67adc3a211c095f085dbd4e902..2f7aa69efc184aebace1a90cdc65de199df50ad6 100644 (file)
@@ -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 (file)
index 0000000..4c564bb
--- /dev/null
@@ -0,0 +1,2 @@
+When PyConfig.stdlib_dir is explicitly set, it's now respected and won't be
+overridden by PyConfig.home.
index 4391a6194c7e58a7c163bf72bf53beeddea01c3e..1410ffdbed8c70c557e56048f9e1b3e673ba613e 100644 (file)
@@ -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