1

プロセスを開始し、プロセスの実行中にそのプロセスの出力を読み取る必要があります。出力 (オプション) を印刷し、プロセスが終了したときに出力を返すことができるようにしたいと考えています。これが私がこれまでに持っているものです(stackoverflowの他の回答からマージされました):

def call(command, print_output):
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    out = ""

    while True:
        line = process.stdout.readline().rstrip().decode("utf-8")
        if line == '':
            break

        if print_output:
            print(line)

        out += line + "\n"

    process.wait()

    return process.returncode, out

このコードは Windows (Windows 7、Python 3.3 でテスト済み) では問題なく動作しますが、Linux (Ubuntu 12.04、Python 3.2) では失敗します。Linux では、スクリプトが次の行でハングします。

line = process.stdout.readline().rstrip().decode("utf-8")

プロセスが終了したとき。

コードの何が問題になっていますか? process.poll() でもプロセスが終了したかどうかを確認しようとしましたが、Linux では常に None を返します。

4

1 に答える 1

0

ドキュメントは言う

Warning Use communicate() rather than 
.stdin.write, .stdout.read or .stderr.read to
avoid deadlocks due to any of the other OS pipe buffers filling 
up and blocking the child process.

Windowsで以前に問題があったことは知っています。

コマンドが何らかの形で非バッファモードで実行されていると思います。

ドキュメントには、シェルバッククォートのように聞こえるサブプロセスを使用するためのレシピがありますが、使用方法subprocessは異なります。

于 2013-02-10T20:53:10.217 に答える