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は、grepさ​​れた行からフィルタリングするためのもう1つの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)](linux2)

4

2 に答える 2

0

ここであなたの質問に直接答えているわけではありませんが、これらの種類のタスクでは、 plumbumが非常に便利であることを指摘しておきます。などの代わりに使用するとpopen、生活がずっと楽になります。

于 2013-03-12T06:06:44.090 に答える
0

ジョブを設定stderrしてzgrepキャプチャし、他の場所でエラーを検出した場合 (たとえば、ループの早期終了に失敗した場合) に、そこに書き込まれた内容のみを印刷することができます。

または、Popen実行するのをやめて、 Pythonで直接zgrep使用を開始します。使用の。zlibgawk

于 2013-03-12T03:32:43.490 に答える