4

さまざまな入力引数を指定してコマンドライン プログラムを実行し、出力から特定の行を取得するスクリプトを作成しました。以下をループで実行しています。

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

1 つの問題は、ループの実行が終了した後にしか出力がないことです。プロセスが終了するたびに何かを印刷したい。どうやってやるの?

また、p1 の出力を表示するオプションが必要です。しかし、p2を壊さずにp1.stdout.readlines()でそれをつかむことはできません。これどうやってするの?

grep を呼び出して p1 の出力を保存し、フレーズを検索することはできないと思っていましたが、出力が多いため、この方法はかなり非効率的です。

どんな提案でも大歓迎です。ありがとう!

4

2 に答える 2

2

これは、Linuxで私のために働いた簡単なハックです。要件によっては、うまくいくかもしれません。これは、スクリプトに渡すと、追加のコピーを/dev/ttyに複製するフィルターとしてteeを使用します(ハックだと言いました)。print_all

#!/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 は ['bar\n'] です
$ ./foo13.py print_all
ふー
バー
バズ
p は ['bar\n'] です
于 2009-04-05T08:11:14.293 に答える
1

各印刷ステートメントの後に sys.stdout.flush() を呼び出してみてください。

于 2009-04-03T17:29:50.020 に答える