我正在使用以下子流程从一个非常大的文件中读取行(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
答案 0 :(得分:0)
您可以为stderr
作业设置zgrep
,捕获它,如果您在其他地方检测到错误,则只打印它在那里写的内容(例如,如果您从未在循环中提前退出)。
或者,停止使用Popen
运行zgrep
并在Python中开始使用zlib
:http://docs.python.org/2/library/zlib.html - 我个人试一试,然后可能实施Python中的全部内容,而不是gawk
。
答案 1 :(得分:0)
我不是直接在这里回答你的问题,但我只是指出,对于这些类型的任务,plumbum非常有用。使用它代替popen
等,将使您的生活变得更加轻松。