diff --git a/src/poetry/utils/env.py b/src/poetry/utils/env.py index 4cd3acfab75..33b2682abae 100644 --- a/src/poetry/utils/env.py +++ b/src/poetry/utils/env.py @@ -1246,7 +1246,7 @@ def python(self) -> Path: """ Path to current python executable """ - return self._bin(self._executable) + return Path(self._bin(self._executable)) @property def marker_env(self) -> dict[str, Any]: @@ -1314,7 +1314,7 @@ def pip(self) -> Path: """ # we do not use as_posix() here due to issues with windows pathlib2 # implementation - path = self._bin(self._pip_executable) + path = Path(self._bin(self._pip_executable)) if not path.exists(): return self.pip_embedded return path @@ -1434,7 +1434,7 @@ def get_marker_env(self) -> dict[str, Any]: raise NotImplementedError() def get_pip_command(self, embedded: bool = False) -> list[str]: - if embedded or not self._bin(self._pip_executable).exists(): + if embedded or not Path(self._bin(self._pip_executable)).exists(): return [str(self.python), str(self.pip_embedded)] # run as module so that pip can update itself on Windows return [str(self.python), "-m", "pip"] @@ -1464,7 +1464,7 @@ def get_command_from_bin(self, bin: str) -> list[str]: # embedded pip when pip is not available in the environment return self.get_pip_command() - return [str(self._bin(bin))] + return [self._bin(bin)] def run(self, bin: str, *args: str, **kwargs: Any) -> str: cmd = self.get_command_from_bin(bin) + list(args) @@ -1544,7 +1544,7 @@ def script_dirs(self) -> list[Path]: self._script_dirs.append(self.userbase / self._script_dirs[0].name) return self._script_dirs - def _bin(self, bin: str) -> Path: + def _bin(self, bin: str) -> str: """ Return path to the given executable. """ @@ -1565,11 +1565,11 @@ def _bin(self, bin: str) -> Path: bin_path = self._path / bin if bin_path.exists(): - return bin_path + return str(bin_path) - return Path(bin) + return bin - return bin_path + return str(bin_path) def __eq__(self, other: object) -> bool: if not isinstance(other, Env): @@ -1883,8 +1883,8 @@ def execute(self, bin: str, *args: str, **kwargs: Any) -> int: return super().execute(bin, *args, **kwargs) return 0 - def _bin(self, bin: str) -> Path: - return Path(bin) + def _bin(self, bin: str) -> str: + return bin @contextmanager diff --git a/tests/utils/test_env.py b/tests/utils/test_env.py index f66f57482f8..da11e7f44b8 100644 --- a/tests/utils/test_env.py +++ b/tests/utils/test_env.py @@ -1828,3 +1828,10 @@ def test_detect_active_python_with_bat(poetry: Poetry, tmp_path: Path) -> None: active_python = EnvManager(poetry)._detect_active_python() assert active_python == wrapped_python + + +def test_command_from_bin_preserves_relative_path(manager: EnvManager) -> None: + # https://github.com/python-poetry/poetry/issues/7959 + env = manager.get() + command = env.get_command_from_bin("./foo.py") + assert command == ["./foo.py"]