diff --git a/src/poetry/utils/env/__init__.py b/src/poetry/utils/env/__init__.py index c3834f4fbaf..9ab3b37d021 100644 --- a/src/poetry/utils/env/__init__.py +++ b/src/poetry/utils/env/__init__.py @@ -21,7 +21,6 @@ from poetry.utils.env.script_strings import GET_ENV_PATH_ONELINER from poetry.utils.env.script_strings import GET_ENVIRONMENT_INFO from poetry.utils.env.script_strings import GET_PATHS -from poetry.utils.env.script_strings import GET_PATHS_FOR_GENERIC_ENVS from poetry.utils.env.script_strings import GET_PYTHON_VERSION_ONELINER from poetry.utils.env.script_strings import GET_SYS_PATH from poetry.utils.env.site_packages import SitePackages @@ -97,7 +96,6 @@ def build_environment( "GET_SYS_PATH", "GET_ENV_PATH_ONELINER", "GET_PYTHON_VERSION_ONELINER", - "GET_PATHS_FOR_GENERIC_ENVS", "EnvError", "EnvCommandError", "IncorrectEnvError", diff --git a/src/poetry/utils/env/base_env.py b/src/poetry/utils/env/base_env.py index f57fb9cc2ae..3c0da4ffa20 100644 --- a/src/poetry/utils/env/base_env.py +++ b/src/poetry/utils/env/base_env.py @@ -175,13 +175,10 @@ def os(self) -> str: @property def site_packages(self) -> SitePackages: if self._site_packages is None: - # we disable write checks if no user site exist - fallbacks = [self.usersite] if self.usersite else [] self._site_packages = SitePackages( self.purelib, self.platlib, - fallbacks, - skip_write_checks=not fallbacks, + self.fallbacks, ) return self._site_packages @@ -214,8 +211,14 @@ def platlib(self) -> Path: return self._platlib + @cached_property + def fallbacks(self) -> list[Path]: + paths = [Path(path) for path in self.paths.get("fallbacks", [])] + paths += [self.usersite] if self.usersite else [] + return paths + def _get_lib_dirs(self) -> list[Path]: - return [self.purelib, self.platlib] + return [self.purelib, self.platlib, *self.fallbacks] def is_path_relative_to_lib(self, path: Path) -> bool: for lib_path in self._get_lib_dirs(): diff --git a/src/poetry/utils/env/generic_env.py b/src/poetry/utils/env/generic_env.py index 276d1b1eb18..28ab156d5a1 100644 --- a/src/poetry/utils/env/generic_env.py +++ b/src/poetry/utils/env/generic_env.py @@ -8,7 +8,7 @@ from typing import TYPE_CHECKING from typing import Any -from poetry.utils.env.script_strings import GET_PATHS_FOR_GENERIC_ENVS +from poetry.utils.env.script_strings import GET_PATHS from poetry.utils.env.virtual_env import VirtualEnv @@ -78,7 +78,7 @@ def find_executables(self) -> None: self._pip_executable = pip_executable def get_paths(self) -> dict[str, str]: - output = self.run_python_script(GET_PATHS_FOR_GENERIC_ENVS) + output = self.run_python_script(GET_PATHS) paths: dict[str, str] = json.loads(output) return paths diff --git a/src/poetry/utils/env/script_strings.py b/src/poetry/utils/env/script_strings.py index dc33e00ba05..a2935b566e9 100644 --- a/src/poetry/utils/env/script_strings.py +++ b/src/poetry/utils/env/script_strings.py @@ -92,18 +92,16 @@ def _version_nodot(version): GET_PATHS = """\ import json -import sysconfig - -print(json.dumps(sysconfig.get_paths())) -""" - -GET_PATHS_FOR_GENERIC_ENVS = """\ -import json import site import sysconfig paths = sysconfig.get_paths().copy() +paths["fallbacks"] = [ + p for p in site.getsitepackages() + if p and p not in {paths.get("purelib"), paths.get("platlib")} +] + if site.check_enableusersite(): paths["usersite"] = site.getusersitepackages() paths["userbase"] = site.getuserbase() diff --git a/src/poetry/utils/env/site_packages.py b/src/poetry/utils/env/site_packages.py index a082419031c..564aa003aa0 100644 --- a/src/poetry/utils/env/site_packages.py +++ b/src/poetry/utils/env/site_packages.py @@ -25,7 +25,6 @@ def __init__( purelib: Path, platlib: Path | None = None, fallbacks: list[Path] | None = None, - skip_write_checks: bool = False, ) -> None: self._purelib = purelib self._platlib = platlib or purelib @@ -40,7 +39,7 @@ def __init__( if path not in self._candidates: self._candidates.append(path) - self._writable_candidates = None if not skip_write_checks else self._candidates + self._writable_candidates: list[Path] | None = None @property def path(self) -> Path: diff --git a/tests/utils/env/test_env.py b/tests/utils/env/test_env.py index b3f63a7339d..97eda471416 100644 --- a/tests/utils/env/test_env.py +++ b/tests/utils/env/test_env.py @@ -309,7 +309,7 @@ def test_env_system_packages_are_relative_to_lib( # These are the virtual environments' base env packages, # in this case the system site packages. - for dist in metadata.distributions(path=[str(env.parent_env.site_packages.path)]): + for dist in env.parent_env.site_packages.distributions(): assert ( env.is_path_relative_to_lib( Path(str(dist._path)) # type: ignore[attr-defined]