Geu*_*uis 11 python asynchronous background-process
我一直在使用它作为参考,但无法完全满足我的需求:在Python中调用外部命令
我也在读这篇文章:http://www.python.org/dev/peps/pep-3145/
对于我们的项目,在部署应用程序之前,我们需要更新5个svn签出.在我的开发环境中,快速部署对于生产力而言比生产部署更重要,我一直在努力加快这一过程.
我有一个bash脚本,一直运作得体,但有一些限制.我使用以下bash命令启动多个'svn updates':
(svn update /repo1) & (svn update /repo2) & (svn update /repo3) &
Run Code Online (Sandbox Code Playgroud)
这些都是并行运行的,效果很好.我还在构建脚本的其余部分中使用此模式来触发每个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 )
Run Code Online (Sandbox Code Playgroud)
我很想找到一种方法让Python启动每个Unix命令,并且如果任何调用在任何时候整个脚本停止都失败了.
nos*_*klo 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'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11402 次 |
最近记录: |