使子进程在Windows上找到git可执行文件

import subprocess

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

我有我的系统路径git,但是当我像这样运行子进程时,我得到:
WindowsError: [Error 2] The system cannot find the file specified

我怎样才能让子进程在系统路径中找到git?

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外壳自动将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()

你意思是

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

的第一个参数subprocess.Popen需要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)

应该做的伎俩。

链接地址: http://www.djcxy.com/p/50857.html

上一篇: Make subprocess find git executable on Windows

下一篇: network programming: Socket function: Address family Vs Protocol family