0

最近、Python シェルでサブプロセスの出力を取得する方法を尋ねました。非常に役立つ応答がありました。POpen に stdout=subprocess.PIPE を供給する

次に p.stdout.readline() を使用し、結果を print() にフィードします

        p = subprocess.Popen(args, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE, cwd=StartPath, shell=False)
        it = iter(p.stdout.readline, b'')
        sRet = "## decode Error ##"
        for line in it:
            try:
                sRet = line.rstrip().decode('utf-8')
            except:
                pass

            print(sRet[:PYTHON_WINDOW_WIDTH])

        viRet = p.wait()

しかし、この POpen を複数のスレッドから同時に呼び出すとどうなるか心配です。

同じ subprocess.PIPE が各 POpen にフィードされています。各 readline が両方のサブプロセスから結果を取得している範囲まで。

やや風変わりな結果が得られるだけでなく、各ループ (for line in it:)

先に進む前に、両方のスレッドのサブプロセスが完了するまで待機しているようです

これは私が望むものではありません。

  • それで、各スレッドが完全に独立していることに依存できるように、自分の PIPE (スレッドごとに 1 つ) を持つことができる方法はありますか?

前もって感謝します

4

1 に答える 1

0

os.pipe() を使用して、答えを見つけたようです

結果は次のようになります。

        r,w = os.pipe()

        my_stdout=os.fdopen(r)
        os.close(w)

        p = subprocess.Popen(args, stdout=my_stdout, stdin=subprocess.PIPE, stderr=my_stdout, cwd=StartPath, shell=False)
        it = iter(p.stdout.readline, b'')
        sRet = "## decode Error ##"
        for line in it:
            try:
                sRet = line.rstrip().decode('utf-8')
            except:
                pass

            with MyGlobals.PrintLock:
                print(sRet[:PYTHON_WINDOW_WIDTH])

        viRet = p.wait()
于 2011-12-06T04:41:34.457 に答える