2

ファイル名を入力として受け取り、コンパイルして実行できるスクリプトを書いています。

ファイルの名前を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'
4

3 に答える 3

0

./autogenがシグナルによって強制終了された場合、 self.process.returncode(.wait()またはの後.communicate()) はゼロ未満であり、その絶対値はシグナルを報告しreturncode == -11ますSIGSERV

于 2014-05-23T23:17:13.380 に答える
0

これを試して。このコードは、失敗して stderr に出力するサブプロセスを実行します。このexceptブロックは、特定のエラー終了コードと stdout/stderr をキャプチャして表示します。

#!/usr/bin/env python

import subprocess

try:
    out = subprocess.check_output(
        "ls non_existent_file",
        stderr=subprocess.STDOUT,
        shell=True)
    print 'okay:',out
except subprocess.CalledProcessError as exc:
    print 'error: code={}, out="{}"'.format(
        exc.returncode, exc.output,
        )

出力例:

$ python ./subproc.py 
error: code=2, out="ls: cannot access non_existent_file: No such file or directory
"
于 2014-05-23T18:06:45.707 に答える
-1

実行時エラーまたはサブプロセスの出力については、次のリンクを確認してください

https://www.endpoint.com/blog/2015/01/28/getting-realtime-output-using-python

def run_command(command):
    process = subprocess.Popen(shlex.split(command), 
    stdout=subprocess.PIPE)
    while True:
        output = process.stdout.readline()
        if output == '' and process.poll() is not None:
            break
        if output:
            print output.strip()
    rc = process.poll()
    return rc
于 2018-09-27T07:21:06.783 に答える