Как записать вывод команды git clone, запущенной из подпроцесса Python

Я пытаюсь запустить команду git clone с помощью subprocess.check_output(), чтобы я мог проверить, успешно ли она клонируется или нет, но это ошибка выброса.

Command 'git clone <url>' returned non-zero exit status 128

Я делаю:

resp = subprocess.check_output('git clone <url>', shell=True)

Как я могу получить вывод git clone, чтобы я мог убедиться, что он работает нормально или нет, и мог поймать любые ошибки, если таковые имеются.

Спасибо

Как вы выполняете команду git clone? Нравится proc = subprocess.Popen(['git', 'clone', url], stdout=subprocess.PIPE)? Тогда вы можете использовать proc.stdout.read().

FHTMitchell 22.08.2018 10:29

@FHTMitchell Я использую subprocess.check_output не с Popen, но я попробую и обновлю.

S Andrew 22.08.2018 10:30

@FHTMitchell Можете ли вы ответить на вопрос, приведя пример

S Andrew 22.08.2018 10:55
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
3
2 122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, лучший способ прочитать вывод подпроцесса - использовать subprocess.PIPE. Например

import subprocess
from collections import namedtuple

def git_clone(url):
    process = subprocess.Popen(['git', 'clone', url], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    return namedtuple('Std', 'out, err')(process.stdout.read(), process.stderr.read())

# test on fake url
out, err = git_clone('http://fake.url')
print('out = {}\nerr = {}'.format(out, err)

выходы:

out = b''
err = b"Cloning into 'fake.url'...\nfatal: unable to access 'http://fake.url/': Couldn't resolve host 'fake.url'\n"

Следовательно, вы можете проверить успех, изменив функцию на

from warnings import warn

def git_clone(url):

    process = subprocess.Popen(['git', 'clone', url], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    if not process.stdout.read():
        warn(process.stderr.read())
        return False

    return True

Спасибо. Но у меня на выходе получился b"Cloning into 'Project'...\nfatal: I don't handle protocol 'git clone https'\n"

S Andrew 22.08.2018 11:17

Это проблема git, а не проблема питона. Какой URL вы передали?

FHTMitchell 22.08.2018 11:21

Но тот же URL-адрес отлично работает на терминале без python :)

S Andrew 22.08.2018 11:22
stackoverflow.com/questions/30474447/… звучит так, как будто у вас есть символ, отличный от ascii
FHTMitchell 22.08.2018 11:24

Другие вопросы по теме