我正在使用 python 从 python 运行一些 c++ 二进制应用程序subprocess.Popen
。我该如何处理这个过程的中止?例如,我的 c++ 中断了断言,我在控制台中看到:
binary: /usr/include/.../file.hpp:42: Assertion `min <= max' failed.
Aborted
进程关闭,但如何使用 popen 句柄在 python 中捕获它?
我正在使用 python 从 python 运行一些 c++ 二进制应用程序subprocess.Popen
。我该如何处理这个过程的中止?例如,我的 c++ 中断了断言,我在控制台中看到:
binary: /usr/include/.../file.hpp:42: Assertion `min <= max' failed.
Aborted
进程关闭,但如何使用 popen 句柄在 python 中捕获它?
你可以捕捉到SIGABRT
信号。但是,请记住,在信号处理程序完成后,如果没有进一步的崩溃,可能无法继续。
我确实建议您尝试修复导致断言失败的任何问题。
如果您已致电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
所以我有同样的效果。