11

私はこれを参照として使用していますが、必要なことを正確に実行できません:Pythonで外部コマンドを呼び出す

私もこれを読んでいました:http ://www.python.org/dev/peps/pep-3145/

私たちのプロジェクトでは、アプリケーションをデプロイする前に更新する必要がある5つのsvnチェックアウトがあります。私の開発環境では、本番デプロイメントよりも迅速なデプロイメントが生産性にとって少し重要であるため、プロセスの高速化に取り組んできました。

私はきちんと機能しているbashスクリプトを持っていますが、いくつかの制限があります。次のbashコマンドを使用して複数の「svnupdates」を起動します。

(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。プログラムを呼び出すためにシェルを呼び出す必要はsvnなく、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 に答える