首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python: subprocess.popen()

Python: subprocess.popen()
EN

Stack Overflow用户
提问于 2011-04-04 22:29:01
回答 1查看 1.5K关注 0票数 1

我有一个关于subprocess.popen()的问题

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

或者,有没有其他方法可以做到这一点并打印结果?

正如您所看到的,在linux机器上执行的以下程序将继续执行:

代码语言:javascript
复制
  >>> import os
  >>> import subprocess as sp
  >>> p = sp.Popen("yes", stdout=sp.PIPE)
  >>> result = p.communicate()[0]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-04 22:52:48

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

代码语言:javascript
复制
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

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5539977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档