我有一个脚本,它安排一个不同程序的长时间运行,有时可以并行运行(即我可以多次调用下面的函数)。我想开除并忘记这些孩子,所以我现在有:
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秒内生成的输出。
答案 0 :(得分:1)
一种简单的方法是让所有孩子都写入临时文件(https://docs.python.org/2/library/tempfile.html)。只需写入而不是管道,只在需要时读取文件(如果发生崩溃)。