我有一个python子进程,通过POpen运行任意C ++程序(学生作业,如果重要)。结构是这样我将一系列输入写入stdin,最后我读取所有stdout并解析每个输出的响应。
当然,鉴于这些是学生作业,他们可能会在某些输入后崩溃。我需要的是知道他们的程序崩溃后的具体输入。
到目前为止,我知道当在C ++程序中抛出运行时异常时,它会打印到stderr。所以没有,我可以在事后阅读stderr并看到它在面部崩溃中做到了。但是我还没有找到一种在程序运行时读取stderr的方法,所以我可以推断出错误是对最新输入的响应。我遇到的每个SO问题或文章似乎都使用了subprocess.communicate(),但是在子进程返回之前,通信似乎一直阻塞,这对我来说没有用,因为我需要继续向如果事件没有崩溃,则事后计划。
答案 0 :(得分:0)
我需要的是知道他们的程序崩溃后的具体输入。
process.stdin.flush()
后致电process.stdin.write(b'your input')
。如果该进程已经死亡,则.write()
或.flush()
将引发异常(特定异常可能取决于系统,例如POSIX上的BrokenPipeError
。
不相关:如果要重定向所有三个标准流(stdin=PIPE, stdout=PIPE, stderr=PIPE
),请确保在编写输入时同时使用stdout,stderr管道,否则子进程可能会挂起,如果它生成足够的输出来填充OS管道缓冲区。你可以使用线程,异步。 IO来做 - code examples。