2017-12-29 31 views
1

を発生したかどうかかどうかを確認したいです。私はPythonのサブプロセスが成功したかエラーが、私はPythonのサブプロセスにコードを作成するコードを作成しようとしています

#code = 'print("hey")' #OK 
code = 'print"hey")' #SyntaxError 
with open(filename, 'w') as f: 
    f.write(code) 

proc = s.Popen(['python',filename], stdout=s.PIPE, stderr=s.STDOUT) 
stdout_v, stderr_v = proc.communicate('') 
print(stdout_v.decode('utf8')) 

これはほぼ同じです。それが正常に動作するか、構文エラーが発生した場合、それはそれらを離れて言うことができない場合でも、

現在、サブプロセスからの戻り値はstdout_vに含まれています。

は、それが正常に実行された場合、私は出力を受け取ることができ、およびエラーが発生した場合、サブプロセスからのエラーメッセージを受け取ることができますか?

+0

あなたは、Python 3.5+を使用することができますか? –

+0

'proc.returncode'を確認してください。 –

+0

BTW - ブラウザで実行できるHTML/JavaScript以外の「スニペット」ボタンは使用しないでください。 '{}'ボタンは他の言語をコード化するために使われます。 –

答えて

3

のPython 3.5+でサブプロセスを使用するために推奨される方法はrun functionです。

proc = s.run(['python',filename], stdout=s.PIPE, stderr=s.PIPE, check=False) 
stdout_v, stderr_v, = proc.stdout, proc.stderr 
return_code = proc.return_code 

セットcheck=True戻りコードがゼロ以外の場合(起こっ多少の誤差の指標である)エラーをスローします。

Pythonの古いバージョンでは、通常はまたはcallの機能を使用することをお勧めしました。 Check_outputは、ゼロ以外の終了コードを検出するとエラーをスローしますが、コール関数は正常に続行されます。文書から

+0

「実行」が「好ましい方法」であるという主張はどこで得られますか? (https://docs.python.org/2/library/subprocess.html#replacing-older-functions-with-the-subprocess-module)[ 'subprocess'古い機構の交換ドキュメント]は、多種多様を示します'run'だけでなく、使います。 –

+0

run関数のドキュメントでは、「サブプロセスを呼び出すための推奨される方法は、処理できるすべてのユースケースに対してrun()関数を使用することです。 –

+0

ああ。これはPython-3固有のものです。 –

0

https://docs.python.org/2/library/subprocess.html

あなたは、引数で

subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) 

実行]コマンドによって、コマンドの有効性を確認することができます。コマンドが完了するのを待ちます。リターンコードが0の場合はリターンを返し、それ以外の場合はCalledProcessErrorを発生させます。 CalledProcessErrorオブジェクトは、returncode属性に戻りコードを持ちます。

Return code 0= Sucess 

あなたは引数を指定して、コマンドの出力

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False) 

実行]コマンドを参照して、バイト列としてその出力を返すようにしたい場合。

+0

returncodeを '1'と比較して失敗を確認することはできません.0以外は失敗です。また、CalledProcessErrorのreturncode属性は、成功した場合にスローされないため、0になることはありません。成功/失敗をチェックするだけの場合は、returncodeをチェックする必要はありません。例外をキャッチして、そこで失敗のケースを処理してください。 – SpoonMeiser

+0

私はリターンコード1を削除しました=失敗、それは入力のために間違っていた –

関連する問題