0

我正在使用以下子进程从一个非常大的文件(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()

以不同的顺序,但无济于事。

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

版本详细信息:Linux2 上的 Python 2.4.3 (#1, Jun 11 2009, 14:09:37) [GCC 4.1.2 20080704 (Red Hat 4.1.2-44)]

4

2 回答 2

0

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

或者,停止使用Popen来运行并直接在 Python 中zgrep开始使用:http: //docs.python.org/2/library/zlib.html - 我个人会尝试一下,然后可能会在 Python 中实现整个事情的使用。zlibgawk

于 2013-03-12T03:32:43.490 回答
0

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

于 2013-03-12T06:06:44.090 回答