どのように私は、ループ内subprocess.Popenへの呼び出しからの出力(...)を印刷できますか?

StackOverflow https://stackoverflow.com/questions/714879

  •  23-08-2019
  •  | 
  •  

質問

私は、異なる入力引数を指定して、コマンドラインプログラムを実行して、出力から特定の行をつかむために、スクリプトを書きました。私は、ループ内で実行されている次ています:

p1 = subprocess.Popen(["program", args], stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell=False)
p2 = subprocess.Popen(["grep", phrase], stdin=p1.stdout, stdout=subprocess.PIPE, shell=False)
p1.wait()
p2.wait()
p = str(p2.stdout.readlines())
print 'p is ', p

一つの問題は、ループの実行が終了した後にのみ出力があるということです。私は何かにプロセスが終了するたびに印刷したいです。どのように私はそれを行うことができますか?

また、私は、P1の出力を表示するオプションを持っていると思います。しかし、私はP2を壊すことなく()p1.stdout.readlinesでそれをつかむことができません。私はこれを行うことができますどのように?

私はちょうど呼び出しは、grepをP1の出力を保存し、フレーズを検索するために作ることができなかったが、出力が多いですので、この方法はかなり非効率的と思われることを考えていた。

任意の提案をいただければ幸いです。ありがとう!

役に立ちましたか?

解決

ここでは、Linux上で私のために働いた迅速なハックです。それはあなたの要件に応じて、あなたのために働くかもしれません。これは、使用していますティーのあなたにprint_allを渡した場合、フィルタとしてのあなたスクリプトは、は/ dev / ttyののに余分なコピーを複製します(ちょっと、私はそれを言いましただったハック):

#!/usr/bin/env python

import subprocess
import sys

phrase = "bar"
if len(sys.argv) > 1 and sys.argv[1] == 'print_all':
    tee_args = ['tee', '/dev/tty']
else:
    tee_args = ['tee']

p1 = subprocess.Popen(["./program"], stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell=False)
p2 = subprocess.Popen(tee_args, stdin=p1.stdout, stdout=subprocess.PIPE, shell=False)
p3 = subprocess.Popen(["grep", phrase], stdin=p2.stdout, stdout=subprocess.PIPE, shell=False)
p1.wait()
p2.wait()
p3.wait()
p = str(p3.stdout.readlines())
print 'p is ', p

programのための内容として、以下の場合:

#!/bin/sh

echo foo
echo bar
echo baz

出力例:

$ ./foo13.py
p is  ['bar\n']
$ ./foo13.py print_all
foo
bar
baz
p is  ['bar\n']

他のヒント

各print文の後にsys.stdout.flush()を呼び出してみます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top