如果程序崩溃,则Python子进程读取stdout / stderr< 10秒

时间:2016-04-29 02:18:08

标签: python subprocess

我有一个脚本,它安排一个不同程序的长时间运行,有时可以并行运行(即我可以多次调用下面的函数)。我想开除并忘记这些孩子,所以我现在有:

p = subprocess.Popen(cmd, shell=False)
time.sleep(20)
result = p.poll()
if result is not None and result != 0:
    print("Child failed to start with exit code: {}".format(result))
    return False
return True

这在大多数情况下运行良好,但我想为孩子获得stdout / stderr,但仅限于它无法运行超过10秒的情况。

根据我的理解,使用Popen(..., stdout=PIPE)意味着如果我只是忽略子进程对象,那么缓冲区将填充,子进程将挂起。

我该如何解决这个问题,以免它挂起来。是否有可能以某种方式将PIPE替换为无。

p = subprocess.Popen(cmd, shell=False, stdout=PIPE, stderr=PIPE)
time.sleep(20)
result = p.poll()
if result is not None and result != 0:
    print("Child failed to start with exit code: {}".format(result))
    stdout, stderr = p.communicate()
    print("STDOUT:", stdout)
    print("STDERR:", stderr)
    return False
return True

也可以安全地假设我可以轻松保存缓冲区中前10秒内生成的输出。

1 个答案:

答案 0 :(得分:1)

一种简单的方法是让所有孩子都写入临时文件(https://docs.python.org/2/library/tempfile.html)。只需写入而不是管道,只在需要时读取文件(如果发生崩溃)。