2010-03-23 5 views
10

Я использовал это в качестве ссылки, но не в состоянии выполнить то, что мне нужно: Calling an external command in PythonАсинхронные фоновые процессы в Python?

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

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

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

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

Они все работаю параллельно, и она работает очень хорошо. Я также использую этот шаблон в остальной части сценария сборки для того, чтобы уволить каждую муравейную сборку, а затем переместить войны в 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, и если какие-либо из вызовов не может в любое время всего скрипт останавливается.

ответ

18

Не использовать 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' 
+2

Это именно то, что я искал. – Geuis

+1

Спасибо, он работает. Есть ли способ запустить подпроцесс в фоновом режиме - теперь отображается в терминале? (в настоящее время я вижу открытую оболочку с рабочей командой) –

Смежные вопросы