プロセスの実行中にサブプロセスの出力を常に印刷する 質問する

プロセスの実行中にサブプロセスの出力を常に印刷する 質問する

Python スクリプトからプログラムを起動するには、次の方法を使用します。

def execute(command):
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    output = process.communicate()[0]
    exitCode = process.returncode

    if (exitCode == 0):
        return output
    else:
        raise ProcessException(command, exitCode, output)

したがって、 のようなプロセスを起動するとProcess.execute("mvn clean install")、プログラムはプロセスが完了するまで待機し、その後にのみプログラムの完全な出力を取得します。 完了するまでに時間のかかるプロセスを実行している場合、これは煩わしいものです。

ループなどで終了する前にプロセス出力をポーリングして、プログラムにプロセス出力を 1 行ずつ書き込ませることはできますか?

私は見つけたこれ関連する可能性のある記事。

ベストアンサー1

使用できますイターコマンドが出力したらすぐに行を処理するには、次のようにします。lines = iter(fd.readline, "")典型的な使用例を示す完全な例を以下に示します (協力してくれた @jfs に感謝します)。

from __future__ import print_function # Only Python 2.x
import subprocess

def execute(cmd):
    popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)
    for stdout_line in iter(popen.stdout.readline, ""):
        yield stdout_line 
    popen.stdout.close()
    return_code = popen.wait()
    if return_code:
        raise subprocess.CalledProcessError(return_code, cmd)

# Example
for path in execute(["locate", "a"]):
    print(path, end="")

おすすめ記事