Commit d4d03d0e by finswimmer Committed by Bjorn Neergaard

add option `virtualenvs.prefer-shell-python`

parent 45b20eee
...@@ -38,6 +38,7 @@ class Config: ...@@ -38,6 +38,7 @@ class Config:
"in-project": None, "in-project": None,
"path": os.path.join("{cache-dir}", "virtualenvs"), "path": os.path.join("{cache-dir}", "virtualenvs"),
"options": {"always-copy": False, "system-site-packages": False}, "options": {"always-copy": False, "system-site-packages": False},
"prefer-shell-python": False,
}, },
"experimental": {"new-installer": True}, "experimental": {"new-installer": True},
"installer": {"parallel": True, "max-workers": None}, "installer": {"parallel": True, "max-workers": None},
...@@ -138,6 +139,7 @@ class Config: ...@@ -138,6 +139,7 @@ class Config:
"virtualenvs.in-project", "virtualenvs.in-project",
"virtualenvs.options.always-copy", "virtualenvs.options.always-copy",
"virtualenvs.options.system-site-packages", "virtualenvs.options.system-site-packages",
"virtualenvs.options.prefer-shell-python",
"experimental.new-installer", "experimental.new-installer",
"installer.parallel", "installer.parallel",
}: }:
......
import contextlib
import logging import logging
import re import re
import subprocess import subprocess
...@@ -19,6 +18,7 @@ from cleo.events.event_dispatcher import EventDispatcher ...@@ -19,6 +18,7 @@ from cleo.events.event_dispatcher import EventDispatcher
from cleo.exceptions import CleoException from cleo.exceptions import CleoException
from cleo.formatters.style import Style from cleo.formatters.style import Style
from cleo.io.inputs.argv_input import ArgvInput from cleo.io.inputs.argv_input import ArgvInput
from cleo.io.outputs.output import Verbosity
from poetry.core.utils._compat import PY37 from poetry.core.utils._compat import PY37
from poetry.__version__ import __version__ from poetry.__version__ import __version__
...@@ -229,6 +229,30 @@ class Application(BaseApplication): ...@@ -229,6 +229,30 @@ class Application(BaseApplication):
return super()._configure_io(io) return super()._configure_io(io)
def _detect_active_python(self, io: "IO") -> str:
executable = None
try:
io.write_line(
"Trying to detect current active python executable as specified in the config.",
verbosity=Verbosity.VERBOSE,
)
executable = decode(
subprocess.check_output(
list_to_shell_command(
["python", "-c", '"import sys; print(sys.executable)"']
),
shell=True,
).strip()
)
io.write_line(f"Found: {executable}", verbosity=Verbosity.VERBOSE)
except CalledProcessError:
io.write_line(
"Unable to detect the current active python executable. Falling back to default.",
verbosity=Verbosity.VERBOSE,
)
return executable
def register_command_loggers( def register_command_loggers(
self, event: "ConsoleCommandEvent", event_name: str, _: Any self, event: "ConsoleCommandEvent", event_name: str, _: Any
) -> None: ) -> None:
...@@ -287,28 +311,17 @@ class Application(BaseApplication): ...@@ -287,28 +311,17 @@ class Application(BaseApplication):
io = event.io io = event.io
poetry = command.poetry poetry = command.poetry
executable = None executable = (
find_compatible = None self._detect_active_python(io)
if poetry.config.get("virtualenvs.prefer-shell-python")
# add on option to trigger this else None
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_manager = EnvManager(poetry)
env = env_manager.create_venv( env = env_manager.create_venv(
io, executable=executable, find_compatible=find_compatible io,
executable=executable,
find_compatible=True if executable else None,
) )
if env.is_venv() and io.is_verbose(): if env.is_venv() and io.is_verbose():
......
...@@ -78,6 +78,11 @@ To remove a repository (repo is a short alias for repositories): ...@@ -78,6 +78,11 @@ To remove a repository (repo is a short alias for repositories):
lambda val: str(Path(val)), lambda val: str(Path(val)),
str(Path(CACHE_DIR) / "virtualenvs"), str(Path(CACHE_DIR) / "virtualenvs"),
), ),
"virtualenvs.prefer-shell-python": (
boolean_validator,
boolean_normalizer,
False,
),
"experimental.new-installer": ( "experimental.new-installer": (
boolean_validator, boolean_validator,
boolean_normalizer, boolean_normalizer,
......
...@@ -56,6 +56,7 @@ virtualenvs.in-project = null ...@@ -56,6 +56,7 @@ virtualenvs.in-project = null
virtualenvs.options.always-copy = false virtualenvs.options.always-copy = false
virtualenvs.options.system-site-packages = false virtualenvs.options.system-site-packages = false
virtualenvs.path = {venv_path} # {config_cache_dir / 'virtualenvs'} virtualenvs.path = {venv_path} # {config_cache_dir / 'virtualenvs'}
virtualenvs.prefer-shell-python = false
""" """
assert expected == tester.io.fetch_output() assert expected == tester.io.fetch_output()
...@@ -79,6 +80,7 @@ virtualenvs.in-project = null ...@@ -79,6 +80,7 @@ virtualenvs.in-project = null
virtualenvs.options.always-copy = false virtualenvs.options.always-copy = false
virtualenvs.options.system-site-packages = false virtualenvs.options.system-site-packages = false
virtualenvs.path = {venv_path} # {config_cache_dir / 'virtualenvs'} virtualenvs.path = {venv_path} # {config_cache_dir / 'virtualenvs'}
virtualenvs.prefer-shell-python = false
""" """
assert config.set_config_source.call_count == 0 assert config.set_config_source.call_count == 0
...@@ -126,6 +128,7 @@ virtualenvs.in-project = null ...@@ -126,6 +128,7 @@ virtualenvs.in-project = null
virtualenvs.options.always-copy = false virtualenvs.options.always-copy = false
virtualenvs.options.system-site-packages = false virtualenvs.options.system-site-packages = false
virtualenvs.path = {venv_path} # {config_cache_dir / 'virtualenvs'} virtualenvs.path = {venv_path} # {config_cache_dir / 'virtualenvs'}
virtualenvs.prefer-shell-python = false
""" """
assert config.set_config_source.call_count == 1 assert config.set_config_source.call_count == 1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment