diff --git a/src/poetry/config/config.py b/src/poetry/config/config.py index 636fa2097dd..86a863b0e7a 100644 --- a/src/poetry/config/config.py +++ b/src/poetry/config/config.py @@ -38,6 +38,7 @@ class Config: "in-project": None, "path": os.path.join("{cache-dir}", "virtualenvs"), "options": {"always-copy": False, "system-site-packages": False}, + "prefer-shell-python": False, }, "experimental": {"new-installer": True}, "installer": {"parallel": True, "max-workers": None}, @@ -138,6 +139,7 @@ def _get_normalizer(name: str) -> Callable: "virtualenvs.in-project", "virtualenvs.options.always-copy", "virtualenvs.options.system-site-packages", + "virtualenvs.options.prefer-shell-python", "experimental.new-installer", "installer.parallel", }: diff --git a/src/poetry/console/application.py b/src/poetry/console/application.py index 80cde5dcfb7..95dfd36edb0 100644 --- a/src/poetry/console/application.py +++ b/src/poetry/console/application.py @@ -290,21 +290,21 @@ def configure_env( executable = None find_compatible = None - # add on option to trigger this - with contextlib.suppress(CalledProcessError): - executable = decode( - subprocess.check_output( - list_to_shell_command( - [ - "python", - "-c", - '"import sys; print(sys.executable)"', - ] - ), - shell=True, - ).strip() - ) - find_compatible = True + if poetry.config.get("virtualenvs").get("prefer-shell-python"): + with contextlib.suppress(CalledProcessError): + executable = decode( + subprocess.check_output( + list_to_shell_command( + [ + "python", + "-c", + '"import sys; print(sys.executable)"', + ] + ), + shell=True, + ).strip() + ) + find_compatible = True env_manager = EnvManager(poetry) env = env_manager.create_venv( diff --git a/src/poetry/console/commands/config.py b/src/poetry/console/commands/config.py index 96df3cd4514..a8f78867757 100644 --- a/src/poetry/console/commands/config.py +++ b/src/poetry/console/commands/config.py @@ -78,6 +78,11 @@ def unique_config_values(self) -> Dict[str, Tuple[Any, Any, Any]]: lambda val: str(Path(val)), str(Path(CACHE_DIR) / "virtualenvs"), ), + "virtualenvs.prefer-shell-python": ( + boolean_validator, + boolean_normalizer, + False, + ), "experimental.new-installer": ( boolean_validator, boolean_normalizer, diff --git a/tests/console/commands/test_config.py b/tests/console/commands/test_config.py index 3278b19a170..9aca2b3d78a 100644 --- a/tests/console/commands/test_config.py +++ b/tests/console/commands/test_config.py @@ -56,6 +56,7 @@ def test_list_displays_default_value_if_not_set( virtualenvs.options.always-copy = false virtualenvs.options.system-site-packages = false virtualenvs.path = {venv_path} # {config_cache_dir / 'virtualenvs'} +virtualenvs.prefer-shell-python = false """ assert expected == tester.io.fetch_output() @@ -79,6 +80,7 @@ def test_list_displays_set_get_setting( virtualenvs.options.always-copy = false virtualenvs.options.system-site-packages = false virtualenvs.path = {venv_path} # {config_cache_dir / 'virtualenvs'} +virtualenvs.prefer-shell-python = false """ assert config.set_config_source.call_count == 0 @@ -126,6 +128,7 @@ def test_list_displays_set_get_local_setting( virtualenvs.options.always-copy = false virtualenvs.options.system-site-packages = false virtualenvs.path = {venv_path} # {config_cache_dir / 'virtualenvs'} +virtualenvs.prefer-shell-python = false """ assert config.set_config_source.call_count == 1