Заставьте подпроцесс находить исполняемый файл git в Windows - PullRequest
9 голосов
/ 11 февраля 2011
import subprocess

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

У меня есть git в моем системном пути, но когда я запускаю подобный подпроцесс, я получаю:
WindowsError: [Error 2] The system cannot find the file specified

Как мне получить подпроцесс для поиска git в системном пути?1006 *

Python 2.6 в Windows XP.

Ответы [ 3 ]

8 голосов
/ 11 мая 2012

Проблема, которую вы видите здесь, заключается в том, что функция 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 состоит в том, что оболочка 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()
1 голос
/ 11 февраля 2011

Вы имеете в виду

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

Первый аргумент subprocess.Popen принимает shlex.split -подобный список аргументов.

или:

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

Этоне рекомендуется, так как вы запускаете оболочку, а затем запускаете процесс в оболочке.

Кроме того, вы должны использовать stdout=subprocess.PIPE для получения результата.

0 голосов
/ 11 февраля 2011

Полагаю, вам нужно передать env Попену, что-то вроде:

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

Должен сделать свое дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...