Pythonで非同期バックグラウンド・プロセス?
-
21-09-2019 - |
質問
私はリファレンスとしてこれを使用しますが、まさに私が必要なものを達成することはできませんされています:<のhref = "https://stackoverflow.com/questions/89228/how-to-call-external-command-in Pythonのの
で外部コマンドを呼び出す-python / 92395#92395" >私もこれを読んでいた: http://www.python.org/ DEV /のPEP / PEP-3145 / の
私たちのプロジェクトのために、我々は我々のアプリケーションをデプロイすることができます更新する必要が前にいることを5つのSVNチェックアウトを持っています。スピーディーな展開はもう少し重要な生産のための生産の展開よりも、私のdevの環境では、私は、プロセスをスピードアップに取り組んでいます。
私はちゃんと働いてますがいくつかの制限がありますされていますbashスクリプトを持っています。
:私は、次のbashコマンドで「SVNのアップデート」複数を起動します(svn update /repo1) & (svn update /repo2) & (svn update /repo3) &
これらのすべての並列に実行され、それはかなりうまく動作します。私はまた、Tomcatに戦争を移動し、その後、各Antビルドをオフに発射のためのビルドスクリプトの残りの部分で、このパターンを使用します。
しかし、私は、更新プログラムのいずれかのビルドが失敗した場合の展開を停止制御することはできません。
私はより多くの枝を制御し、展開プロセスを持っているので、私は、Pythonで私のbashスクリプトを再書いています。
私は、コマンド「/レポはsvn update」をオフに解雇するsubprocess.call()を使用していますが、それぞれが順番に行動しています。私は「(SVN更新/レポ)&」とそれらのすべての火災をオフしてみてください、しかし、結果コードを返しますすぐに。私は特定のコマンドは非同期モードで失敗したかどうかを判断する方法がありませんので。
import subprocess
subprocess.call( 'svn update /repo1', shell=True )
subprocess.call( 'svn update /repo2', shell=True )
subprocess.call( 'svn update /repo3', shell=True )
私は、各UnixコマンドオフPythonの火を持ってする方法を見つけるのが大好きです、と呼び出しのいずれかが任意の時点で失敗した場合、スクリプト全体が停止します。
解決
shell=True
を使用しないでください。それはあなたのsvn
プログラムを呼び出すためにシェルたinvoke needlessyなり、それはあなたの代わりに、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'