From 059dacdd3c45e08d64792b7704c261f775fb2e88 Mon Sep 17 00:00:00 2001 From: Tzu-ping Chung Date: Thu, 26 Jul 2018 17:04:59 +0800 Subject: [PATCH] Use COMSPEC for shell detection fallback The subshell logic now considers: * PIPENV_SHELL * Auto detection * SHELL (should very likely work for POSIX) * PYENV_SHELL * COMSPEC (should always work for Windows) --- pipenv/environments.py | 6 +++++- pipenv/shells.py | 8 ++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/pipenv/environments.py b/pipenv/environments.py index afe82988..6e0c8651 100644 --- a/pipenv/environments.py +++ b/pipenv/environments.py @@ -207,7 +207,11 @@ if "PIPENV_ACTIVE" not in os.environ and not PIPENV_IGNORE_VIRTUALENVS: PIPENV_SKIP_VALIDATION = True # Internal, the default shell to use if shell detection fails. -PIPENV_SHELL = os.environ.get("SHELL") or os.environ.get("PYENV_SHELL") +PIPENV_SHELL = ( + os.environ.get("SHELL") or + os.environ.get("PYENV_SHELL") or + os.environ.get("COMSPEC") +) # Internal, to tell if pyenv is installed. PYENV_ROOT = os.environ.get("PYENV_ROOT", os.path.expanduser("~/.pyenv")) diff --git a/pipenv/shells.py b/pipenv/shells.py index 10826f22..70b236ea 100644 --- a/pipenv/shells.py +++ b/pipenv/shells.py @@ -29,7 +29,7 @@ def detect_info(): raise ShellDetectionFailure -def _get_activate_script(venv): +def _get_activate_script(cmd, venv): """Returns the string to activate a virtualenv. This is POSIX-only at the moment since the compat (pexpect-based) shell @@ -37,11 +37,11 @@ def _get_activate_script(venv): """ # Suffix and source command for other shells. # Support for fish shell. - if PIPENV_SHELL and "fish" in PIPENV_SHELL: + if "fish" in cmd: suffix = ".fish" command = "source" # Support for csh shell. - elif PIPENV_SHELL and "csh" in PIPENV_SHELL: + elif "csh" in cmd: suffix = ".csh" command = "source" else: @@ -104,7 +104,7 @@ class Shell(object): dims = get_terminal_size() with temp_environ(): c = pexpect.spawn(self.cmd, ["-i"], dimensions=(dims.lines, dims.columns)) - c.sendline(_get_activate_script(venv)) + c.sendline(_get_activate_script(self.cmd, venv)) if args: c.sendline(" ".join(args))