2

我正在使用 python 从 python 运行一些 c++ 二进制应用程序subprocess.Popen。我该如何处理这个过程的中止?例如,我的 c++ 中断了断言,我在控制台中看到:

binary: /usr/include/.../file.hpp:42: Assertion `min <= max' failed.
Aborted

进程关闭,但如何使用 popen 句柄在 python 中捕获它?

4

2 回答 2

1

你可以捕捉到SIGABRT信号。但是,请记住,在信号处理程序完成后,如果没有进一步的崩溃,可能无法继续。

我确实建议您尝试修复导致断言失败的任何问题。

于 2012-06-27T13:34:18.457 回答
1

如果您已致电handle = subprocess.Popen(...),您将不得不在某个时候致电handle.wait()。它的返回值同时returncode也是进程句柄对象的属性,显示进程是否正常完成(值>=0)或是否因信号而死亡(值<0)。

例子:

>>> import subprocess
>>> subprocess.call("kill -ABRT $$", shell=True)
-6
>>> a = subprocess.Popen("kill -ABRT $$", shell=True)
>>> a.wait()
-6
>>> subprocess.call("kill -SEGV $$", shell=True)
-11

一个 C 程序看起来像

#include <assert.h>

int main() {
    assert(0);
}

我可以

>>> import subprocess
>>> subprocess.call(["./ass"])
ass: ass.c:4: main: Assertion `0' failed.
-6

所以我有同样的效果。

于 2012-06-27T14:14:58.793 回答