subprocess.Popenから返されたファイルハンドルをポーリングする方法はありますか?

StackOverflow https://stackoverflow.com/questions/883152

  •  22-08-2019
  •  | 
  •  

質問

私はこれを書い言います

from subprocessing import Popen, STDOUT, PIPE
p = Popen(["myproc"], stderr=STDOUT, stdout=PIPE)

今、私がしなければ、

line = p.stdout.readline()
サブプロセスは、次の行を出力するまで、

私のプログラムを待ちます。

私はそれがあるかどう出力を読んで、ちょうどそう続けることができるように、私はp.stdoutに行うことができます任意の魔法はありますか?私はQueue.get_nowait()のようなものを探しています。

私はちょうどp.stdoutを読み取るためのスレッドを作成するのではなく、のは、私は新しいスレッドを作成することはできませんと仮定してみましょうことを知っています。

役に立ちましたか?

解決

http://docs.python.org/を参照して、Pythonの標準ライブラリにselectモジュールを使用しますライブラリ/ select.htmlするselect.select([p.stdout.fileno()], [], [], 0)はすぐにその項目3つのリストがあるタプルを返します。最初のものは、そのファイルディスクリプタに読み込むための何かがあるかどう非空であることを行っている。

他のヒント

これは

文字で文字を読みますp.stdout.read(1)を使用します

そして、ここで完全な例です。

import subprocess
import sys

process = subprocess.Popen(
    cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE
)

while True:
    out = process.stdout.read(1)
    if out == '' and process.poll() != None:
        break
    if out != '':
        sys.stdout.write(out)
        sys.stdout.flush()
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top