2016-10-09 12 views
0

私はPythonスクリプトでログを検索していますが、見つかったログを継続的に出力しています。そのような例:python Linuxシェルでサブプロセスパイプを使う方法

$ python logsearch.py​​ | grep timeout

問題は、logsearch.py​​が終了するまでソートとwcはブロックされますが、logsearch.py​​は結果を継続的に出力します。

サンプルlogsearch.py​​:

p = subprocess.Popen("ping google.com", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
for line in p.stdout: 
    print(line) 

UPDATE:

はちょうどsys.stdoutにサブプロセスで標準出力を変更、Pythonはあなたのためのパイプを処理する、考え出しました。

p = subprocess.Popen("ping -c 5 google.com", shell=True, stdout=**sys.stdout**) 

ご協力いただきありがとうございます!

+0

'ping -c 5'は永遠に実行されるスクリプトの奇妙な例です!しかし、ええ、あなたはそれらをすべて持っているまで、物事を分類したり、物の数を数えることはできません。 – tdelaney

+0

@tdelaney pingのカウントを削除し、ソートの代わりにgrepを使用します。データがパイプを通じてgrepに流れなければならないが、何も印刷せずに永久に実行されるようだ。 –

+0

出力がタイムアウトと一致しないため、何も受信しません。 $ python logsearch.py​​を試してみてください。 grep -v timeout –

答えて

0

なぜgrepを使用しますか?なぜPythonですべてのことをしないのですか?

from subprocess import Popen, PIPE 
p = Popen(['ping', 'google.com'], shell=False, stdin=PIPE, stdout=PIPE) 

for line in p.stdout: 
    if 'timeout' in line.split(): 
     # Process the error 
     print("Timeout error!!") 
    else: 
     print(line) 

UPDATE:
私はお勧め@tripleeとしてpopenのラインを変更します。長所と短所Actual meaning of 'shell=True' in subprocess

+0

理由は、grepや他のシェルcmdが柔軟性を追加することですが、データをよりうまく処理するために、grepやsortまたはawkを追加することをお勧めします。 –

+0

OK。その場合は、[Python module sh](https://pypi.python.org/pypi/sh)を使用することができます。多くの便利なコマンドをbashで実装します。 –

+0

また、 '' Popen(['ping'、 'google.com']、shell = False、...) 'を使用して、無駄なシェルを生成しないようにします。 – tripleee

関連する問題