subprocess.Popenから返されたファイルハンドルをポーリングする方法はありますか?
-
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()
所属していません StackOverflow