2010-03-23 91 views
10

我一直用這個作爲參考,但不能夠做到正是我需要的:Calling an external command in PythonPython中的異步後臺進程?

我也正在看這個:http://www.python.org/dev/peps/pep-3145/

對於我們的項目,我們有需要更新5個SVN檢出然後才能部署我們的應用程序。在我的開發環境中,快速部署對於生產力而言比生產部署更重要,我一直在努力加快這一過程。

我有一個bash腳本,一直在正常工作,但有一些限制。我用下面的bash命令啓動了多個'svn更新':

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

這些都是並行運行,它工作得很好。我還在構建腳本的其餘部分使用這種模式來觸發每個螞蟻構建,然後將戰爭移動到Tomcat。

但是,如果其中一個更新或構建失敗,我無法控制停止部署。

我正在用Python重寫我的bash腳本,所以我對分支和部署過程有了更多的控制。

我使用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。它將不必要地調用shell來調用你的svn程序,這會給你shell的返回碼而不是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

謝謝,它的工作原理。有沒有辦法在後臺運行子進程 - 現在顯示在終端? (目前我看到帶有工作命令的開放shell) –