我对subprocess.popen()
:
如果假设执行的命令是在while循环中 - subprocess.popen()
有没有办法检测它并在打印第一个输出后退出?
或者还有其他方法可以打印结果吗?
正如您所看到的,在Linux机器上执行的以下程序一直在执行:
>>> import os
>>> import subprocess as sp
>>> p = sp.Popen("yes", stdout=sp.PIPE)
>>> result = p.communicate()[0]
答案 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()并返回输出,但由于我上面解释的原因,这在您的示例中不起作用。