2

我正在编写一个脚本,它可以将文件名作为输入,编译并运行它。

我将文件名作为输入(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)

在这两种情况下,我都在使用

(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 == -11for SIGSERV

于 2014-05-23T23:17:13.380 回答
0

尝试这个。该代码运行一个子进程,该子进程失败并打印到 stderr。该except块捕获特定的错误退出代码和标准输出/标准错误,并显示它。

#!/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 回答