确定 python 子进程何时(/在哪个输入之后)崩溃

Determine when(/after which input) a python subprocess crashes

我有一个 python 子进程,它 运行 是一个通过 POpen 的任意 C++ 程序(如果重要的话,学生作业)。结构是这样的,我将一系列输入写入标准输入,最后我读取所有标准输出并解析对每个输出的响应。

当然,鉴于这些是学生作业,它们可能会在某些输入后崩溃。我需要的是知道在哪个特定输入之后他们的程序崩溃了。

到目前为止,我知道当 C++ 程序中抛出 运行time 异常时,它会打印到 stderr。所以我可以在事后阅读 stderr 并看到它在面对崩溃时确实如此。但是我还没有找到在程序仍在 运行ning 时读取 stderr 的方法,因此我可以推断错误是对最新输入的响应。我 运行 涉及的每个 SO 问题或文章似乎都使用了 subprocess.communicate(),但在子进程 returns 之前,通信似乎一直处于阻塞状态,这对我不起作用,因为如果它没有崩溃,我需要在事后继续向程序发送输入。

What i require is to know after which specific input their program crashed.

process.stdin.write(b'your input') 之后调用 process.stdin.flush()。如果进程已经死了,那么 .write().flush() 将引发异常(具体的异常可能取决于系统,例如 POSIX 上的 BrokenPipeError)。

不相关:如果您要重定向所有三个标准流 (stdin=PIPE, stdout=PIPE, stderr=PIPE),那么请确保在写入输入时同时使用 stdout、stderr 管道,否则如果子进程生成足够的输出到填充 OS 管道缓冲区。你可以使用线程,异步。 IO 去做 -- code examples.