11

我一直以此作为参考,但无法完全完成我所需要的:Calling an external command in Python

我也在读这个: http: //www.python.org/dev/peps/pep-3145/

对于我们的项目,我们有 5 个 svn checkout 需要更新,然后才能部署我们的应用程序。在我的开发环境中,快速部署对于生产力来说比生产部署更重要,我一直在努力加快这个过程。

我有一个运行良好但有一些限制的 bash 脚本。我使用以下 bash 命令启动多个“svn 更新”:

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

这些都是并行运行的,而且效果很好。我还在构建脚本的其余部分使用这种模式来启动每个 ant 构建,然后将战争转移到 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 命令,如果任何调用在任何时候失败,整个脚本都会停止。

4

1 回答 1

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'
于 2010-03-23T00:50:32.443 回答