Hacer que el subproceso encuentre git ejecutable en Windows

import subprocess proc = subprocess.Popen('git status') print 'result: ', proc.communicate() 

Tengo git en la ruta de mi sistema, pero cuando ejecuto un subproceso como este recibo:
WindowsError: [Error 2] The system cannot find the file specified

¿Cómo puedo obtener un subproceso para encontrar git en la ruta del sistema?

Python 2.6 en Windows XP.

El problema que ve aquí es que la función API de Windows CreateProcess , utilizada por el subproceso bajo el capó, no resuelve automáticamente otras extensiones ejecutables que .exe . En Windows, el comando ‘git’ realmente se instala como git.cmd . Por lo tanto, debes modificar tu ejemplo para invocar explícitamente git.cmd :

 import subprocess proc = subprocess.Popen('git.cmd status') print 'result: ', proc.communicate() 

La razón por la que git funciona cuando shell==True es que el shell de Windows resuelve automáticamente git a git.cmd .

Eventualmente, resuelve git.cmd tu mismo:

 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() 

Te refieres

 proc = subprocess.Popen(["git", "status"], stdout=subprocess.PIPE) 

El primer argumento de subprocess.Popen toma una lista de argumentos similar a shlex.split .

o:

 proc = subprocess.Popen("git status", stdout=subprocess.PIPE, shell=True) 

No se recomienda, ya que está iniciando un shell y luego iniciando un proceso en el shell.

Además, debe usar stdout=subprocess.PIPE para recuperar el resultado.

Creo que necesitas pasar env a Popen, algo como:

 import subprocess, os proc = subprocess.Popen('git status', env=os.environ, stdout=subprocess.PIPE) 

Debería hacer el truco.