Я использовал это в качестве ссылки, но не способный выполнить точно, в чем я нуждаюсь: Вызов внешней команды в Python
Я также читал это: http://www.python.org/dev/peps/pep-3145/
Для нашего проекта у нас есть 5 svn контроля, который должен обновить, прежде чем мы сможем развернуть наше приложение. В моей dev среде, где быстрое развертывание немного более важно для производительности, чем производственное развертывание, я работал над ускорением процесса.
У меня есть сценарий удара, который работал прилично, но имеет некоторые ограничения. Я разжигаю несколько 'svn обновления' со следующей командой удара:
(svn update /repo1) & (svn update /repo2) & (svn update /repo3) &
Они все работают параллельно, и это работает вполне прилично. Я также использую этот шаблон в остальной части сценария сборки для того, чтобы исчерпать каждую сборку муравья, затем перемещая войны в Tomcat.
Однако я не имею никакого контроля над останавливающимся развертыванием, если одно из обновлений или сборки перестало работать.
Я переписываю свой сценарий удара с Python, таким образом, я имею больше контроля над ответвлениями и процессом развертывания.
Я использую subprocess.call () для исчерпывания 'svn, обновляют/repo' команды, но каждый действует последовательно. Я пробую' (svn, обновляют/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'