捕获通过subprocess模块的POPen函数执行的可执行文件的运行时错误

1 投票
1 回答
860 浏览
提问于 2025-04-17 20:20

我正在写一个Python脚本,用来编译和运行C/C++代码。我想捕捉到运行时错误。比如:Nzecv、段错误、碎片错误等等。

我使用以下命令来执行编译后的文件:

process = Popen( exec_path , stdin=PIPE, stdout=PIPE, stderr=PIPE, shell= False) 
(output, error) = process.communicate(testCase)

我尝试了一些有运行时错误的程序,但错误没有在stderr中显示出来。经过一些研究,我发现stderr是从程序的返回值中读取的。在C语言和大多数其他程序中,主函数返回的是自定义的值(比如“return 0;”),而不是错误信号。

那么,是否有可能捕捉到运行时错误信号呢?我应该如何实现这个呢?

编辑:运行时错误信号可以通过终端捕捉到吗?怎么做?如果可以的话,我会通过Python运行相应的shell脚本。

1 个回答

1

有没有办法捕捉到运行时错误信号?我该如何实现呢?

要判断子进程是否是因为信号被杀掉的,可以查看 process.returncode

如果返回的值是负数 -N,说明子进程是因为信号 N 被终止的(仅限于 Unix 系统)。

注意:如果你想在子进程中为某个信号提供自定义处理方式,可以在 preexec_fn 中调用 signal.signal(),具体可以参考 这个代码示例,它展示了如何使用 preexec_fn 恢复默认的信号处理方式

撰写回答