2016-10-12 5 views
0

私はsubprocess.Popenを使ってmakeコマンドを実行しています。しかし、makeが失敗すると、私はmakeから正確なエラーを取得せず、escriptは実行し続けるだけです。どのように私は、makeコマンドの正確出力スクリプトは、コンソールを停止して表示するように入手できますかサブプロセスをリダイレクトする。stderrをコンソールに開く

def app(self, build, soc, target): 
    command = "make BUILD=%s SOC=%s TARGET=%s" % (build, soc, target) 
    subprocess.Popen(command.split(), shell=False, 
           stdout=subprocess.PIPE, 
           stderr=subprocess.PIPE).communicate() 
+0

を、それが失敗したとき、あなたは何(のpython関連)エラーが出るのですか? –

+0

最も簡単な方法は、可能であれば、Python 3.4を使用し、 'subprocess.popen()'の呼び出しを 'subprocess.run()'に置き換えることです。これは、stdoutとstderrの戻りコードと結果を文字列のリストとして含むオブジェクトを返します。 –

+0

@Tom Dalton実際に問題はそれだけであり、例外をスローしないということです。スクリプトの後半では、makeコマンドの受け渡しに依存します。ここでスクリプトが失敗します。 – homeGrown

答えて

2

あなたは交換してくださいでした:

subprocess.Popen(command.split(), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 

をして:

p = subprocess.Popen(command.split(), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
print p.communicate() 
print p.returncode 

そして、私たちを聞かせて印刷された出力がどのように見えるかを知る。

0

実際にコンソールに出力するには、subprocess.PIPEをstdout/stderrに使用しないでください。デフォルトでは、呼び出されるプロセスはPythonプロセスのstdout/stderrハンドルを使用します。

subprocess.check_call(command.split()) 

しかし、あなたはあなたのスクリプトで使用するためのmakeの出力をキャプチャする必要がある場合、あなたは:と呼ばれるプロセスは、ゼロ以外の終了コードを返す場合、その場合、あなたはsubprocess.CalledProcessErrorを高めるためにsubprocess.check_call()機能を使用することができますこれは単一の値にstdoutとstderr出力を組み合わせること

try: 
    output = subprocess.check_output(command.split(), stderr=subprocess.STDOUT) 
except subprocess.CalledProcessError as e: 
    output = e.output 
    # error handling here 

注:類似subprocess.check_output()関数を使用することができます。あなたがそれらを個別に必要な場合は、.communicate()方法と併せてsubprocess.Popenコンストラクタを使用する必要がありますし、手動でPopenオブジェクトのreturncode属性をチェックします:

p = subprocess.Popen(command.split(), stdout=subprocess.PIPE, 
     stderr=subprocess.PIPE) 
out, err = p.communicate() 
if p.returncode != 0: 
    # raise exception or other error handling here 
関連する問題