diff --git a/news/2651.behavior b/news/2651.behavior new file mode 100644 index 0000000000..be5f2d014d --- /dev/null +++ b/news/2651.behavior @@ -0,0 +1,2 @@ +Add ``COMSPEC`` to fallback option (along with ``SHELL`` and ``PYENV_SHELL``) +if shell detection fails, improving robustness on Windows. diff --git a/pipenv/environments.py b/pipenv/environments.py index 037e75a3c1..e3fd793ebe 100644 --- a/pipenv/environments.py +++ b/pipenv/environments.py @@ -207,7 +207,11 @@ 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 whether the command line session is interactive. SESSION_IS_INTERACTIVE = bool(os.isatty(sys.stdout.fileno())) diff --git a/pipenv/shells.py b/pipenv/shells.py index 10826f228a..70b236ea07 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 @@ def fork_compat(self, venv, cwd, args): 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))