1

次のコードがあります。

    argpass = ['nohup']
    argpass.append('/path/to/script')

    log_output_err = open(log_file,'a+')
    out = subprocess.Popen(argpass,
                       stdout = log_output_err,
                       stderr = log_output_err)

    #if the script fails I need to have some logic here...

/path/to/script のリターン コードを取得するにはどうすればよいのでしょうか。

/path/to/script にロジックを挿入する必要があるだけかもしれませんが、何か考えはありますか?

ありがとう、

4

1 に答える 1

4

subprocess.Popenオブジェクトには、アクセスreturncodeできる属性があります。

http://docs.python.org/2/library/subprocess.html#subprocess.Popen.returncode

check_call便利な関数を使用して調べることもできます。

http://docs.python.org/2/library/subprocess.html#subprocess.check_call

戻りコードがゼロの場合にのみ戻ります。それ以外の場合は、 (そこから属性CalledProcessErrorを読み取ることができます) が発生します。returncode

あなたの例では、stdout と stderr は、ログ ファイルではなく、呼び出し元の Python スクリプトを指しています。

>>> import subprocess
>>> argpass = ['echo']
>>> argpass.append('hello world')
>>> # I reroute to PIPE because I don't have a logfile
>>> log_output_err = subprocess.PIPE 
>>> out = subprocess.Popen(argpass,
               stdout = log_output_err,
               stderr = log_output_err)
>>> output,error = out.communicate()
>>> print output
hello world

>>> # Check if child process has terminated. 
>>> # If it has finished, will return returncode attribute.
>>> # Otherwise, it returns None
>>> out.poll()
0
>>> # Or we can read the returncode attribute directly:
>>> out.returncode # Direct
0
>>> 

プロセスが完了するまでに時間がかかる場合returncodeは、確認に行ったときに値が設定されていない可能性があります。の値がreturncodeisの場合、None子プロセスがまだ終了していないことを意味します。.wait()子プロセスがメソッドで終了するまで、スクリプトの実行を停止できます。

于 2013-09-24T18:32:56.797 に答える