Python中的异步后台进程?

11

我一直在使用这个作为参考,但是无法完全达到我所需要的:在Python中调用外部命令

我也读了这篇文章:http://www.python.org/dev/peps/pep-3145/

对于我们的项目,在我们可以部署应用程序之前,有5个svn检出需要更新。在我的开发环境中,快速部署对生产部署来说更为重要,因此我一直在努力加快这个过程。

我有一个Bash脚本,表现还不错,但也有一些限制。我使用以下Bash命令启动多个'svn update':

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

这些操作都是并行运行的,效果很好。我还在构建脚本的其它部分使用了这种模式,来依次启动每个ant构建,然后将war文件移动到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命令,如果任何一个调用在任何时候失败,整个脚本将停止。

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'

2
这正是我正在寻找的。 - Geuis
1
谢谢,它有效。有没有办法在后台运行子进程 - 而不是在终端中显示?(目前我看到打开的 shell 并且有工作命令) - Vladimir Starkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接