From f8775b32e70d4fee3751bc262eab0d69fb88eb31 Mon Sep 17 00:00:00 2001 From: Tzu-ping Chung Date: Tue, 19 Jun 2018 23:09:12 +0800 Subject: [PATCH] Use shell=False when "run" if possible on Windows Do a "where" on the command; if it is found, prevent the intermediate COMSPEC and use CreateProcess directly. Only use shell=True if the command is not an executable. This prevents some unexpected behaviour caused by the intermediate shell process. --- pipenv/core.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pipenv/core.py b/pipenv/core.py index be67c8f5..0610e214 100644 --- a/pipenv/core.py +++ b/pipenv/core.py @@ -2266,7 +2266,12 @@ def inline_activate_virtualenv(): def do_run_nt(script): import subprocess - p = subprocess.Popen(script.cmdify(), shell=True, universal_newlines=True) + command = system_which(script.command) + options = {'universal_newlines': True} + if command: # Try to use CreateProcess directly if possible. + p = subprocess.Popen([command] + script.args, **options) + else: # Command not found, maybe this is a shell built-in? + p = subprocess.Popen(script.cmdify(), shell=True, **options) p.communicate() sys.exit(p.returncode)