どのように私は、ループ内subprocess.Popenへの呼び出しからの出力(...)を印刷できますか?
-
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()を呼び出してみます。
所属していません StackOverflow