Вопрос

Я использовал это в качестве ссылки, но не смог выполнить именно то, что мне нужно: Вызов внешней команды в Python

Я тоже читал это: http://www.python.org/dev/peps/pep-3145/

Для нашего проекта у нас есть 5 проверок svn, которые необходимо обновить, прежде чем мы сможем развернуть наше приложение.В моей среде разработки, где быстрое развертывание немного более важно для производительности, чем производственное, я работал над ускорением этого процесса.

У меня есть сценарий bash, который работает нормально, но имеет некоторые ограничения.Я запускаю несколько «обновлений svn» с помощью следующей команды bash:

(svn update /repo1) & (svn update /repo2) & (svn update /repo3) &

Все они работают параллельно и работают довольно хорошо.Я также использую этот шаблон в остальной части сценария сборки для запуска каждой сборки ant, а затем переноса войн в Tomcat.

Однако я не могу контролировать остановку развертывания в случае сбоя одного из обновлений или сборки.

Я переписываю свой bash-скрипт на Python, чтобы иметь больше контроля над ветвями и процессом развертывания.

Я использую subprocess.call() для запуска команд «svn update/repo», но каждая из них действует последовательно.Я пробую «(svn update/repo) &», и все они срабатывают, но код результата возвращается немедленно.Поэтому у меня нет возможности определить, завершится сбой конкретной команды или нет в асинхронном режиме.

import subprocess

subprocess.call( 'svn update /repo1', shell=True )
subprocess.call( 'svn update /repo2', shell=True )
subprocess.call( 'svn update /repo3', shell=True )

Мне бы хотелось найти способ, чтобы Python запускал каждую команду Unix, и если какой-либо из вызовов в любой момент завершается неудачно, весь сценарий останавливается.

Это было полезно?

Решение

Не используйте shell=True.Нет необходимости вызывать оболочку для вызова вашего svn программа, и это даст вам код возврата оболочки вместо кода svn.

repos = ['/repo1', '/repo2', '/repo3']
# launch 3 async calls:
procs = [subprocess.Popen(['svn', 'update', repo]) for repo in repos]
# wait.
for proc in procs:
    proc.wait()
# check for results:
if any(proc.returncode != 0 for proc in procs):
    print 'Something failed'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top