2012-01-27 10 views
3

私はディレクトリからgrepしようとしており、検索結果を最初の100件に制限しようとしています。PopenによるPython grepとpipe

p_grep = Popen(['/bin/bash', '-c', 'grep -F "asdasdasd" data/*'], stdout = PIPE) 
p_head = Popen(['head', '-100'], stdin = p_grep.stdout, stdout = PIPE) 
output = p_head.communicate()[0] 

はどのようにそれを修正するには:次のコードは、

[..] 
grep: writing output: Broken pipe 
grep: writing output: Broken pipe 
grep: writing output: Broken pipe 
grep: writing output: Broken pipe 
[..] 

コードを得続けますか?あなたが行うことができます。この場合、実際に

+2

これを試してみてください: http://stackoverflow.com/questions/2595602/pythons-popen-cleanup – xkrz

+1

@xkrzは、彼がやっていることを正確に示唆された解決策ではありませんか? –

+0

grepを実行する必要がありますか、これはほんの一例ですか?それ以外の場合、grepには--max-countオプションがあり、出力全体をパイプする代わりに使用できます。 – GaretJax

答えて

1

output = check_output(['/bin/bash', '-c', 'grep -F "asdasdasd" data/* | head -100']) 
+0

この問題は、私はなぜそれがすべてのグリッピングを実行したのかわからないので、シェルでは数秒しかかかりませんが、Pythonでもっと長い時間がかかります – pistacchio

+0

@pistacchio、canあなたは '--line-buffered'を' grep'に渡して、それが何か変わるかどうか試してみますか? –

+0

私はそれを試みましたが、それは変わりません:( – pistacchio

0

彼らはSIGPIPEを受信することができるようにPopen documentation on writing pipesあなたは(この場合はp_grepに)パイプで連結されたプロセスにstdoutを閉じて確認する必要がありますによると、パイプされたプロセス(この場合はp_head)から取得します。

さらに、this postによれば、各サブプロセスにセットアップ機能を提供して、SIGPIPEの処理がデフォルトの動作に復元されるようにすることが重要です。

だからコードは次のようになります。grepプロセスは一度head完了を終了させる必要があります

def preexec_fn(): 
    import signal 
    signal.signal(signal.SIGPIPE, signal.SIG_DFL) 

p_grep = Popen(['/bin/bash', '-c', 'grep -F "asdasdasd" data/*'], stdout=PIPE, preexec_fn=preexec_fn) 
p_head = Popen(['head', '-100'], stdin=p_grep.stdout, stdout=PIPE, preexec_fn=preexec_fn) 
p_grep.stdout.close() 
output = p_head.communicate()[0] 

関連する問題