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

时间:2011-02-11 02:51:11

标签: python windows git path subprocess

import subprocess

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

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

如何让subprocess在系统路径中找到git?

Windows XP上的Python 2.6。

4 个答案:

答案 0 :(得分:8)

您在此处看到的问题是,由底层流程使用的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的原因是{shell}会自动将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()

答案 1 :(得分:1)

你的意思是

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来检索结果。

答案 2 :(得分:0)

请注意,到2020年,使用Git 2.28(2020年第三季度)时,将不再支持Python 2.6或更早版本。

请参见commit 45a87a8Denton Liu (Denton-L)(2020年6月7日)。
(由Junio C Hamano -- gitster --commit 6361eb7中合并,2020年6月18日)

CodingGuidelines:指定Python 2.7是最旧的版本

签名人:刘登顿

0b4396f068中(“ git-p4:使python2.7成为受支持的最旧版本”,2019-12-13,Git v2.27.0-rc0-merge在{{ 3}}),git-p4已更新为仅支持2.7及更高版本。由于Python 2.6几乎是很古老的历史,因此更新CodingGuidelines以显示2.7是受支持的最旧版本。

答案 3 :(得分:-2)

我相信你需要将env传递给Popen,例如:

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

应该做的伎俩。