2017-02-04 4 views
1

私は特定の入力を与えるとクラッシュするアプリケーションがあります。コマンドラインプロンプトで、私は "アクセス違反"メッセージなどを見ることができます そして、プログラムは入力を処理するときに終了しません(終わりのないループの一種)。それを削除するには、Ctrl + Cキーを押す必要があります。Python - プログラムのクラッシュ後にプログラムを続ける

私の質問は次のとおりです。どのようにプログラムからそのクラッシュをスキップできますか?

私の目標は、プログラムがクラッシュした場合にそのプログラムにその入力を与えることです。 入力を保存したいのですが、クラッシュしない場合は、入力して を削除して次の入力を続けますか?

私のコードは次のとおりです。

import subprocess 


program_to_call = "C:\\Program Files\\Software\\application.exe" 
arg = "-s" 

file = "C:\\Users\\test\\Desktop\\Project\\templates\\file1" 

subprocess.Popen([program_to_call, arg, file], shell=True) # <---after this line, it does not go to next line 

... code for removing etc. 

私は、Pythonを学んでおりますので、私はあなたの答えに私の問題のための便利なPythonライブラリにいくつかのアドバイス、概念やヒントを見たいのですが。コードスニペットを書く必要はありません。

注:私はWindows 7(x86)を使用しており、pythonのバージョンは2.7.1です。

+0

Popenは終了を待つ必要があるので、代わりに 'subprocess.call([program_to_call、arg、file])'を試すことができます。 –

+0

はい、エラーメッセージをキャプチャしてクラッシュするかどうかを判断したいと思います。したがって、** code = subprocess.check_output(...)**を使用しましたが、ハングします。 – aminakoy

+0

エラーメッセージがstdoutに書き込まれる可能性があります。引数 'stderr = sys.stdout'を使って' subprocess.check_output'を呼び出すのがうまくいくかどうか試してください。 – L3viathan

答えて

0

まず、プログラムがSTDERRまたはSTDOUTにエラーメッセージを書き込むかどうかを調べる必要があります。次に、エラーメッセージを出力した後、バッファをフラッシュすることを願ってください。あなたはstdout=subprocess.PIPEstderrと同様の)引数を与える場合は、オンデマンドでのテキストの出力を確認することができますので、それはそれを作るだろう

p = subprocess.Popen([program_to_call, ...], stdout=subprocess.PIPE) # or stderr=... 
while True: 
    out, err = p.communicate() 
    # now check whether error message is in out (or err) 
    if p.returncode is not None: # process is dead 
     break 

:最後に、あなたはこれを行うことができます。これは、ファイルオブジェクトp.stdoutから読み取るか、p.communicate()を使用して行うことができます。これは、処理がもう終了していない場合はp.returncodeを埋め込むという素晴らしい副作用があります。

この解決策がうまくいかない場合は、おそらくあなたが呼び出すプログラムは、出力ストリームのバッファをフラッシュせず、そのことについて少ししか行いません。

+1

はい、それは働いた。私はまた、無限のwhileループ内で単純なtry/exceptブロックを使用して問題を解決しました。しかし、あなたのソリューションでは、私はリターンコードを保存します。 ** code = p.returncode ** ** break **キーワードの前にも**非常にいいです。 – aminakoy

関連する問題