Проблема, которую вы видите здесь, заключается в том, что функция Windows API CreateProcess , используемая внутренним подпроцессом, не разрешает автоматически разрешать другие исполняемые расширения, кроме .exe
.В Windows команда 'git' действительно установлена как git.cmd
.Поэтому вы должны изменить ваш пример, чтобы явно вызывать git.cmd
:
import subprocess
proc = subprocess.Popen('git.cmd status')
print 'result: ', proc.communicate()
Причина git
работает, когда shell==True
состоит в том, что оболочка Windows автоматически разрешает git
в git.cmd
.
В конце концов, разрешите git.cmd самостоятельно:
import subprocess
import os.path
def resolve_path(executable):
if os.path.sep in executable:
raise ValueError("Invalid filename: %s" % executable)
path = os.environ.get("PATH", "").split(os.pathsep)
# PATHEXT tells us which extensions an executable may have
path_exts = os.environ.get("PATHEXT", ".exe;.bat;.cmd").split(";")
has_ext = os.path.splitext(executable)[1] in path_exts
if not has_ext:
exts = path_exts
else:
# Don't try to append any extensions
exts = [""]
for d in path:
try:
for ext in exts:
exepath = os.path.join(d, executable + ext)
if os.access(exepath, os.X_OK):
return exepath
except OSError:
pass
return None
git = resolve_path("git")
proc = subprocess.Popen('{0} status'.format(git))
print 'result: ', proc.communicate()