Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何打破在子进程上迭代的循环。Popen stdout?_Python - Fatal编程技术网

Python 如何打破在子进程上迭代的循环。Popen stdout?

Python 如何打破在子进程上迭代的循环。Popen stdout?,python,Python,我正在使用下面的子进程从一个相当大的文件(arnd 4 GB)中读取行 其中cmd=zgrep“要搜索的文本”filename.gz gawk_exp只是另一个要从灰色行中筛选的gawk表达式 然后在p上迭代,如下所示: for line in iter(p.stdout.readline, ''): .. .. .. if(success): break 这将导致“grep:writing output:break pipe”错误 但是,如果满足某些条件

我正在使用下面的子进程从一个相当大的文件(arnd 4 GB)中读取行

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

gawk_exp只是另一个要从灰色行中筛选的gawk表达式

然后在p上迭代,如下所示:

for line in iter(p.stdout.readline, ''):
   ..
   ..
   ..
   if(success):
      break 
这将导致“grep:writing output:break pipe”错误

但是,如果满足某些条件,我希望尽早退出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(2009年6月11日14:09:37)
[GCC 4.1.2 20080704(Red Hat 4.1.2-44)]在linux2上

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


或者,停止使用
Popen
运行
zgrep
,开始直接在Python中使用
zlib
:-我个人会尝试一下,然后可能用Python实现整个过程,而不是使用
gawk

我不是直接回答你的问题,但我要指出的是,对于这类任务,它是非常有用的。用它代替popen等,会让你的生活变得更加轻松。

谢谢你的链接。不幸的是,我不能使用它,因为我必须使用2.4.3。
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()