Я надеюсь, что эта справка поможет решить проблему, с которой вы столкнулись: здесь вы действительно должны использовать communicate
с subprocess.PIPE
, так как она ожидает завершения команды и выдаст вам весь вывод:
outputstring = p2.communicate()[0]
Вы также можете использовать удобный метод, такой как check_output
для того же эффекта:
outputstring = subprocess.check_output(['~/Desktop/find_accuracies.sh', commit],
encoding='utf-8', shell=True)
Или также в py3 использование run
должно также сделать:
p2 = subprocess.run(['~/Desktop/find_accuracies.sh', commit],
encoding='utf-8', shell=True, stdout=subprocess.PIPE)
outputstring = p2.stdout
Теперь еще несколько комментариев, советов и предложений:
Я немного удивлен, что это работает для вас, поскольку вы используете shell=True
и список аргументов должен (см. Абзац, начинающийся с "В POSIX с shell=True
" ) make Ваш commit
аргумент базового sh
обернут вокруг вашего вызова скрипта, а не самого скрипта. В любом случае вы можете (и я бы посоветовал) на самом деле сбросить shell
и оставить разрешение HOME
на python:
from pathlib import Path
executable = Path.home().joinpath('Desktop/find_accuracies.sh')
p2 = subprocess.run([executable, commit],
encoding='utf-8', stdout=subprocess.PIPE)
outputstring = p2.stdout
Вы можете (или должны для py <3.5) также использовать <code>os.path.expanduser('~/Desktop/find_accuracies.sh') вместо Path.home()
, чтобы получить скрипт executable
. С другой стороны, для> = 3.7 вы можете заменить stdout=subprocess.PIPE
на capture_output=True
.
И последнее, но не менее важное. Кажется немного ненужным вызывать скрипт bash (особенно в двойном обёртке при вызове sh
, как в оригинальном примере) только для запуска от git
до grep
, когда у нас уже есть скрипт python для обработки информации. На самом деле я попытался бы запустить соответствующую команду git
, непосредственно получая большую часть ее вывода, и обработать ее в самом скрипте python, чтобы получить интересующие биты.