我正在编写一个脚本,可以将文件名作为输入,编译并运行它。
我将文件名作为输入(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'
答案 0 :(得分: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
"
答案 1 :(得分:0)
如果./autogen
被信号杀死,则self.process.returncode
(在.wait()
或.communicate()
之后)小于零且其绝对值报告信号,例如{{1} } returncode == -11
。
答案 2 :(得分:-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