Вызов
A subprocess.check_output()
фактически возвращает вывод (и вы также можете получить вывод об ошибке, передав параметр stderr
). Возможно, вы захотите взглянуть на это, чтобы увидеть, дает ли оно ошибку, объясняющую, что произошло.
Поскольку вы получаете исключение (то есть вызов не завершается, следовательно, вывод может быть не возвращен), выдолжен быть в состоянии получить выходные данные от одного из членов исключения:
try:
output = subprocess.check_output(['git', 'checkout', sha], stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
print("Exception on process, rc=", e.returncode, "output=", e.output)
Одна вещь, которую я делаю , это то, что некоторые git
команды имеют тенденцию возвращать 128, если выВы на самом деле не в репозиторий Git. Поэтому я буду искать путь, следующий за вашей cl("cd", repo)
строкой, с:
os.system("pwd") # use "cd" for Windows.
Если ваш cd
работает в подпроцессе , , который будет не влияет на текущий процесс, и, следовательно, вы вовсе не обязательно должны быть в Git-репо. Это, безусловно, объяснило бы код возврата 128
.
В качестве примера, следующая транскрипция показывает, что происходит, когда я пытаюсь выполнить команду git
вне репо:
>>> try:
... output = subprocess.check_output(['git', 'checkout', '12345'])
... except subprocess.CalledProcessError as e:
... print(e.returncode, e.output)
...
128 b'fatal: not a git repository (or any of the parent directories): .git\n'
Если выяснится, что вы находитесь в неправильном каталоге (т. Е. Оператор cl("cd", repo)
выполняет подпроцесс для изменения каталога), вы должны использовать метод Python-blessed для изменения каталогов (a) :
import os
os.chdir(path)
Это фактически изменяет каталог для немедленного процесса (интерпретатор Python), а не для временного подпроцесса.
(a) На самом деле это хороший совет в целом - используйте как можно больше специфических для Python вещей (так как они в основном кросс-платформенные), а не порождают суб-оболочку (которая по своей природе является платформой)-специфический).