Skip to content

Commit abcc889

Browse files
committed
fix(env): ensure all system site paths are used
With this change, when using newer Python versions (>=3.12), Poetry correctly detects and considers read-only system site packages when an environment is loaded. Resolves: #9878
1 parent b491f6a commit abcc889

File tree

3 files changed

+17
-6
lines changed

3 files changed

+17
-6
lines changed

src/poetry/utils/env/base_env.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ def __init__(self, path: Path, base: Path | None = None) -> None:
6161
self._supported_tags: list[Tag] | None = None
6262
self._purelib: Path | None = None
6363
self._platlib: Path | None = None
64+
self._fallbacks: list[Path] | None = None
6465
self._script_dirs: list[Path] | None = None
6566

6667
self._embedded_pip_path: Path | None = None
@@ -175,13 +176,10 @@ def os(self) -> str:
175176
@property
176177
def site_packages(self) -> SitePackages:
177178
if self._site_packages is None:
178-
# we disable write checks if no user site exist
179-
fallbacks = [self.usersite] if self.usersite else []
180179
self._site_packages = SitePackages(
181180
self.purelib,
182181
self.platlib,
183-
fallbacks,
184-
skip_write_checks=not fallbacks,
182+
self.fallbacks,
185183
)
186184
return self._site_packages
187185

@@ -214,8 +212,16 @@ def platlib(self) -> Path:
214212

215213
return self._platlib
216214

215+
@property
216+
def fallbacks(self) -> list[Path]:
217+
if self._fallbacks is None:
218+
self._fallbacks = [Path(path) for path in self.paths.get("fallbacks", [])]
219+
self._fallbacks += [self.usersite] if self.usersite else []
220+
221+
return self._fallbacks
222+
217223
def _get_lib_dirs(self) -> list[Path]:
218-
return [self.purelib, self.platlib]
224+
return [self.purelib, self.platlib, *self.fallbacks]
219225

220226
def is_path_relative_to_lib(self, path: Path) -> bool:
221227
for lib_path in self._get_lib_dirs():

src/poetry/utils/env/script_strings.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@ def _version_nodot(version):
9797
9898
paths = sysconfig.get_paths().copy()
9999
100+
paths["fallbacks"] = [
101+
p for p in site.getsitepackages()
102+
if p and p not in {paths.get("purelib"), paths.get("platlib")}
103+
]
104+
100105
if site.check_enableusersite():
101106
paths["usersite"] = site.getusersitepackages()
102107
paths["userbase"] = site.getuserbase()

tests/utils/env/test_env.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ def test_env_system_packages_are_relative_to_lib(
309309

310310
# These are the virtual environments' base env packages,
311311
# in this case the system site packages.
312-
for dist in metadata.distributions(path=[str(env.parent_env.site_packages.path)]):
312+
for dist in env.parent_env.site_packages.distributions():
313313
assert (
314314
env.is_path_relative_to_lib(
315315
Path(str(dist._path)) # type: ignore[attr-defined]

0 commit comments

Comments
 (0)