Rendre le sous-processus find git executable sous Windows

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

J’ai git dans mon chemin système, mais quand je lance un tel sous-processus, je reçois:
WindowsError: [Error 2] The system cannot find the file specified

Comment puis-je obtenir un sous-processus pour trouver git dans le chemin du système?

Python 2.6 sur Windows XP.

Le problème que vous voyez ici est que la fonction d’API Windows CreateProcess , utilisée par le sous-processus sous le capot, ne résout pas automatiquement les autres extensions exécutables que .exe . Sous Windows, la commande ‘git’ est vraiment installée sous le nom git.cmd . Par conséquent, vous devez modifier votre exemple pour appeler explicitement git.cmd :

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

La raison pour laquelle git fonctionne lorsque shell==True est que le shell Windows résout automatiquement git en git.cmd .

Finalement, résolvez vous-même 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() 

Vous voulez dire

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

Le premier argument de shlex.split prend une liste d’arguments de type shlex.split .

ou:

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

Ceci n’est pas recommandé, car vous lancez un shell puis lancez un processus dans le shell.

Vous devez également utiliser stdout=subprocess.PIPE pour récupérer le résultat.

Je crois que vous devez passer env pour Popen, quelque chose comme:

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

Devrait faire le tour.