3

(現在python 3.2を使用)

次のことができる必要があります。

  • サブプロセスを使用してコマンドを実行する
  • そのコマンドの stdout/stderr の両方をリアルタイムで端末に出力する必要があります (両方が stdout または stderr などで出力されるかどうかは問題ではありません)
  • 同時に、コマンドが stderr に何かを出力したかどうか (できれば何を出力したか) を知る方法が必要です。

サブプロセスパイプをいじったり、bashで奇妙なパイプリダイレクトを行ったり、を使用しteeたりしましたが、まだうまくいくものは見つかりませんでした。これは可能なことですか?

4

2 に答える 2

2

私の解決策:

import subprocess

process = subprocess.Popen("my command", shell=True,
                           stdout=None, # print to terminal
                           stderr=subprocess.PIPE)
duplicator = subprocess.Popen("tee /dev/stderr", shell=True, # duplicate input stream
                              stdin=process.stderr, 
                              stdout=subprocess.PIPE, # catch error stream of first process
                              stderr=None) # print to terminal
error_stream = duplicator.stdout
print('error_stream.read() = ' + error_stream.read())
于 2012-10-14T21:38:20.510 に答える
0

次のようなことを試してください:

import os

cmd = 'for i in 1 2 3 4 5; do sleep 5; echo $i; done'
p = os.popen(cmd)

while True:
    output = p.readline()
    print(output)
    if not output: break

popen3python2 では、次のように使用して stderr を簡単にキャッチすることもできます。

i, o, err = os.popen3(cmd)

しかし、python3にはそのような機能はないようです。これを回避する方法が見つからない場合は、subprocess.Popenここで説明されているように、直接使用してみてください: http://www.saltycrane.com/blog/2009/10/how-capture-stdout-in-real-time-python/

于 2012-10-14T21:35:30.990 に答える