让subprocess在Windows上findgit可执行文件

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

我有我的系统pathgit,但是当我像这样运行subprocess时,我得到:
WindowsError: [Error 2] The system cannot find the file specified

我怎样才能让subprocess在系统path中findgit?

Windows XP上的Python 2.6。

您在此处看到的问题是,由子进程使用的Windows API函数CreateProcess不会自动解析除.exe以外的其他可执行文件扩展名。 在Windows上,'git'命令实际上被安装为git.cmd 。 因此,您应该修改您的示例以显式调用git.cmd

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

shell==True时, git工作的原因是Windows外壳自动解析gitgit.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() 

你意思是

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

shlex.split的第一个参数需要一个shlex.split的参数列表。

要么:

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

这是不推荐的,因为你正在启动一个shell,然后在shell中启动一个进程。

另外,您应该使用stdout=subprocess.PIPE来检索结果。

我相信你需要把env传给Popen,就像:

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

应该做的伎俩。