2013-03-12 63 views
0

我使用下面的subprocesss读取从相当大的文件行(4的Arnd GB)如何从遍历Subprocess.Popen标准输出的循环中断开?

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只是另一个GAWK表达式从grepped行过滤。

,然后在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(红帽4.1.2-44)上linux2上

回答

0

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

或者停止使用Popen运行zgrep,并开始使用Python zlib直:http://docs.python.org/2/library/zlib.html - 我个人倒试试这个,其次是可能实现整个事情在Python,而不是使用gawk

0

我不直接在这里回答你的问题,但我只是指出,对于这些类型的任务plumbum是非常有用的。用它代替popen等,会让你的生活变得如此简单。

+0

感谢您的链接。不幸的是我不能使用它,因为我必须使用2.4.3。 – Aymer 2013-03-14 06:00:18