6

Python のサブプロセス モジュールを介してコマンド ライン ユーティリティを実行しています。コマンド ライン引数と stdout=subprocess.PIPE を指定して subprocess.Popen() オブジェクトを作成し、subprocess.wait() を使用してタスクが完了するまで待機し、タスクが正常に完了したかどうかを示すリターン コードを返します。 .

translate = subprocess.Popen(['gdal_translate', '-of', 'HFA', 'inDataset', 'outDataset'], stdout=subprocess.PIPE)
if translate.wait() == 0: print "Success"
else: print "Fail - %s" % translate.stdout.read()

Windows コマンド プロンプトでスクリプトを実行すると、gdal_translate によって提供されるメッセージが表示され、プロセスが失敗する原因となるエラーが発生したと表示されますが、スクリプトは引き続き「成功」と出力します。

戻りコードが常に 0 の場合、コマンド ライン ユーティリティによって報告されたエラーを確認するにはどうすればよいですか?

4

1 に答える 1

9

エラーが出力されても、戻りコードがゼロである可能性があります。コードでは、標準出力のみをキャプチャし、標準エラーはキャプチャしません。以下のrun関数では、コマンドを実行し、実行が終了するのを待ってから、リターンコードの標準エラーと標準出力を読み取ります。標準エラーに何かがある場合、またはリターンコードがゼロでない場合は、それを失敗として扱います。コードで4つの呼び出し例を確認できます。最初の呼び出しは通常の成功した呼び出しであり、2番目の呼び出しは戻りコード0ですが、エラー時の出力と標準出力があります。3番目の例にはゼロ以外の戻りコードとエラー出力があり、最後の例にはゼロ以外の戻りコードがあり、出力はまったくありません。

コード

from subprocess import Popen, PIPE

def run(cmd):
    print '-'*40
    print 'running:', cmd
    p = Popen(cmd, stderr=PIPE, stdout=PIPE, shell=True)
    output, errors = p.communicate()
    print [p.returncode, errors, output]
    if p.returncode or errors:
        print 'something went wrong...'

run("echo all is well")
run("echo out;echo error 1>&2")
run("this-will-fail")
run("exit 1")

出力

----------------------------------------
running: echo all is well
[0, '', 'all is well\n']
----------------------------------------
running: echo out;echo error 1>&2
[0, 'error\n', 'out\n']
something went wrong...
----------------------------------------
running: this-will-fail
[127, '/bin/sh: this-will-fail: not found\n', '']
something went wrong...
----------------------------------------
running: exit 1
[1, '', '']
something went wrong...
于 2012-12-20T19:42:50.767 に答える