如何从遍历Subprocess.Popen标准输出的循环中断?

时间:2013-03-12 03:25:28

标签: python

我正在使用以下子流程从一个非常大的文件中读取行(arnd 4 GB)

p1=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
p=subprocess.Popen(gawk_exp, shell=True, stdin=p1.stdout, stdout=subprocess.PIPE)

其中cmd = zgrep“要搜索的文本”filename.gz

gawk_exp只是从grepped行中过滤的另一个gawk表达式。

然后按如下方式迭代p:

for line in iter(p.stdout.readline, ''):
   ..
   ..
   ..
   if(success):
      break 

这导致“grep:写入输出:管道损坏”错误。

但如果它满足某些条件,我想从for循环中提前退出。

我尝试了许多途径,

if(success):
    os.kill(p.pid, signal.SIGKILL)
    os.kill(p1.pid, signal.SIGKILL)
    OR
    subprocess.Popen.kill(p1.pid, p.pid)
    subprocess.Popen.kill(p.pid)
    OR
    p1.stdout.close()
    p.stdout.close()

以不同的顺序,但没有用。

关于如何优雅地摆脱循环的任何提示?

版本详情: Python 2.4.3(#1,2009年6月11日,14:09:37) [gCC 4.1.2 20080704(Red Hat 4.1.2-44)] on linux2

2 个答案:

答案 0 :(得分:0)

您可以为stderr作业设置zgrep,捕获它,如果您在其他地方检测到错误,则只打印它在那里写的内容(例如,如果您从未在循环中提前退出)。

或者,停止使用Popen运行zgrep并在Python中开始使用zlibhttp://docs.python.org/2/library/zlib.html - 我个人试一试,然后可能实施Python中的全部内容,而不是gawk

答案 1 :(得分:0)

我不是直接在这里回答你的问题,但我只是指出,对于这些类型的任务,plumbum非常有用。使用它代替popen等,将使您的生活变得更加轻松。