1. ホーム
  2. パイソン

[解決済み】プロセス実行中にサブプロセスの出力が常に表示される。

2022-04-04 20:31:50

質問

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") 私のプログラムは、そのプロセスが終了するまで待機し、そのとき初めて私のプログラムの完全な出力を得ることができます。これは、終了までに時間がかかるプロセスを実行している場合、迷惑な話です。

ループか何かで終了する前にプロセス出力をポーリングすることで、プログラムに一行ずつプロセス出力を書かせることは可能でしょうか?

私が見つけたのは これ という記事があります。

解決するには?

を使用することができます。 それ を使えば、コマンドが行を出力したらすぐに処理することができます。 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="")