非阻塞子进程并捕获每个子进程的输出

时间:2015-12-09 13:35:00

标签: python multithreading subprocess popen python-multithreading

所以我遇到了这个棘手的情况,我需要执行一些子进程并能够获得每个子进程输出。 这就是我正在使用的atm:

output = Popen(cmd, stdout=PIPE, stderr=STDOUT)
output = output.communicate()[0]

哪种方法效果很好,如果有错误,也会给我带来错误。 现在我需要执行其中的10个并且能够获得每个输出。我想知道是否有一种顺利的方法可以做到这一点而不使用多线程。

1 个答案:

答案 0 :(得分:1)

subprocess.Popen异步启动子进程,只有communicate使操作同步。

所以你必须先启动所有子进程。然后,根据您希望如何处理其输出,您可以:

  • 如果您需要以有序的方式处理输出,即显示cmd1的输出,然后是cmd2,...只需对每个子命令使用communicatewait
  • 如果您需要尽快处理输出并且使用Linux或类Unix平台,则可以使用select模块。
  • 如果您需要在每个命令结束后立即处理输出并希望支持Windows平台,您可以在子进程上循环subprocess.poll以了解哪些已完成。
  • 如果您需要更多,则可能需要使用线程