ファイル名を入力として受け取り、コンパイルして実行できるスクリプトを書いています。
ファイルの名前をinput(input_file_name)として取っています。まず、Python 内からファイルをコンパイルします。
self.process = subprocess.Popen(['gcc', input_file_name, '-o', 'auto_gen'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, shell=False)
次に、同じ (Popen) 呼び出しを使用して実行可能ファイルを実行しています。
subprocess.Popen('./auto_gen', stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, shell=False)
どちらの場合も、次を使用して stdout(および stderr) の内容をキャッチしています。
(output, _) = self.process.communicate()
これで、コンパイル中にエラーが発生した場合、リターンコードが 1 であるためエラーをキャッチでき、gcc が stderr でエラーを送信するため、エラーの詳細を取得できます。
ただし、プログラム自体は、正常に実行された場合でもランダムな値を返す可能性があります (最後に「0 が返されない可能性があるため)」。そのため、リターンコードを使用して実行時エラーをキャッチすることはできません。さらに、実行可能ファイルは stderr でエラーの詳細を送信しません。そのため、コンパイル時のエラーをキャッチするために使用したトリックは使用できません。
実行時エラーをキャッチする、またはエラーの詳細を出力する最良の方法は何ですか? つまり、./auto_gen がセグメンテーション違反をスローした場合、次のいずれかを出力できるはずです。
'Runtime error'
'Segmentation Fault'
'Program threw a SIGSEGV'