Python:subprocess.popen()

时间:2011-04-04 14:29:01

标签: python subprocess

我对subprocess.popen()

有疑问

如果假设执行的命令是在while循环中 - subprocess.popen()有没有办法检测它并在打印第一个输出后退出?

或者还有其他方法可以打印结果吗?

正如您所看到的,在Linux机器上执行的以下程序一直在执行:

  >>> import os
  >>> import subprocess as sp
  >>> p = sp.Popen("yes", stdout=sp.PIPE)
  >>> result = p.communicate()[0]

1 个答案:

答案 0 :(得分:4)

只有当被调用的程序预计很快以较少的输出终止时,通信方法才有用。在您的示例中,“是”程序永远不会终止,因此通信永远不会完成。为了处理无限期执行的子进程,并且可能产生大量输出,你需要包含一个重复调用p.poll()的循环,直到p.poll()返回None以外的值,这表示该过程已经终止。在此循环中,您应该从p.stdout和p.stderr读取以使用程序中的任何输出。如果不消耗输出,缓冲区可能会填满并导致程序阻塞等待能够写入更多输出。

import subprocess
import time

p = subprocess.Popen("yes", stdout=subprocess.PIPE)
result = ""

start_time = time.time()

while (p.poll() is None):
  result += p.stdout.read(8192)
  time.sleep(1)
  if (time.time() - start_time) > 5:
    print "Timeout"
    break

print result

请注意,上面的示例将无限期地运行,直到您杀死它正在读取输入的“是”子进程。如果要检测进程没有终止,可以在while循环中添加时间检查,并在经过足够的时间后跳出一段时间。

如果您确定您的子进程将自行终止,您只需调用communic()并返回输出,但由于我上面解释的原因,这在您的示例中不起作用。