From cb14c70e998eb29cc43199695284c82d1906d1e8 Mon Sep 17 00:00:00 2001 From: Arun Babu Neelicattu Date: Thu, 25 Mar 2021 22:06:49 +0100 Subject: [PATCH] pip installer: fix installed script executable --- poetry/utils/pip.py | 31 ++++++++++++++++++++--------- tests/installation/test_executor.py | 2 +- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/poetry/utils/pip.py b/poetry/utils/pip.py index 1c182e46708..a4929709105 100644 --- a/poetry/utils/pip.py +++ b/poetry/utils/pip.py @@ -1,8 +1,12 @@ +import os +import sys + from pathlib import Path from typing import Union from poetry.exceptions import PoetryException from poetry.utils.env import Env +from poetry.utils.env import EnvCommandError from poetry.utils.env import ephemeral_environment @@ -14,9 +18,13 @@ def pip_install( upgrade: bool = False, ) -> Union[int, str]: path = Path(path) if isinstance(path, str) else path + is_wheel = path.suffix == ".whl" args = ["install", "--prefix", str(environment.path)] + if not is_wheel: + args.insert(1, "--use-pep517") + if upgrade: args.append("--upgrade") @@ -32,16 +40,21 @@ def pip_install( args.append(str(path)) - if path.is_file() and path.suffix == ".whl": + try: return environment.run_pip(*args) - - with ephemeral_environment( - executable=environment.python, pip=True, setuptools=True - ) as env: - return env.run( - "pip", - *args, - ) + except EnvCommandError as e: + if sys.version_info < (3, 7) and not is_wheel: + # Under certain Python3.6 installs vendored pip wheel does not contain zip-safe + # pep517 lib. In this cases we create an isolated ephemeral virtual environment. + with ephemeral_environment( + executable=environment.python, pip=True, setuptools=True + ) as env: + return environment.run( + env._bin("pip"), + *args, + env={**os.environ, "PYTHONPATH": str(env.purelib)}, + ) + raise PoetryException(f"Failed to install {path.as_posix()}") from e def pip_editable_install(directory: Path, environment: Env) -> Union[int, str]: diff --git a/tests/installation/test_executor.py b/tests/installation/test_executor.py index 368b72c90f5..4511e770a9d 100644 --- a/tests/installation/test_executor.py +++ b/tests/installation/test_executor.py @@ -137,7 +137,7 @@ def test_execute_executes_a_batch_of_operations( expected = set(expected.splitlines()) output = set(io.fetch_output().splitlines()) assert expected == output - assert 4 == len(env.executed) + assert 5 == len(env.executed) assert 0 == return_code pip_editable_install.assert_called_once()