7

似たような投稿がたくさんありますが、答えが見つかりませんでした。

Gnu / Linuxでは、Pythonモジュールsubprocessを使用して、次のコードを使用して、サブプロセスで起動されたコマンドのstdout/sdterrを反復処理します。

class Shell:
    """ 
    run a command and iterate over the stdout/stderr lines
    """

    def __init__(self):

        pass

    def __call__(self,args,cwd='./'):

        p = subprocess.Popen(args,
                cwd=cwd, 
                stdout = subprocess.PIPE,
                stderr = subprocess.STDOUT,
                )

        while True:

            line = p.stdout.readline()
            self.code = p.poll()

            if line == '':
                if self.code != None:
                    break
                else:
                    continue

            yield line

#example of use
args = ["./foo"]
shell = Shell()
for line in shell(args):
     #do something with line
     print line,

これは正常に機能します...実行されたコマンドがpythonたとえば`args= ['python'、'foo.py']の場合を除いて、出力はフラッシュされず、コマンドが終了したときにのみ出力されます。

解決策はありますか?

4

1 に答える 1

2

Python印刷の出力をフラッシュする方法を確認してください。。

-uオプションを指定してPythonサブプロセスを実行する必要があります。

-u stdin、stdout、およびstderrを完全にバッファリング解除するように強制します。重要なシステムでは、stdin、stdout、stderrもバイナリモードにします。xreadlines()、readlines()、およびファイルオブジェクトイテレータ(「sys.stdinの行」)には、このオプションの影響を受けない内部バッファリングがあることに注意してください。これを回避するには、「while1:」ループ内で「sys.stdin.readline()」を使用する必要があります。

または、Pythonサブプロセススクリプトを制御できる場合は、sys.stdout.flush()を使用して、印刷するたびに出力をフラッシュできます。

import sys
sys.stdout.flush()
于 2012-07-30T20:21:21.840 に答える