:私のパッケージまさにこれを行いpython-gnupg
、gpg
産卵(python superprint.py
printandwait.py同じディレクトリにそれらの両方を作成し、実行しますGnuプライバシーガード)をサブプロセスで実行します。一般的なケースでは、サブプロセスのstdoutとstderrにはsubprocess.PIPE
を指定する必要があります。 2つの別々のスレッドを作成して、stdoutとstderrのサブプロセスを好きな場所に読み込みます。
python-gnupg
の場合、gpg
プロセスが実行されている間(完了するまで待機していない)、gpgからのステータスメッセージが読み込まれ、処理されます。
基本的には、擬似コードは
process = subprocess.Popen(..., stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stderr = process.stderr
rr = threading.Thread(target=response_reader_func, args=(process.stderr,))
rr.setDaemon(True)
rr.start()
dr = threading.Thread(target=data_reader_func, args=(process.stdout,))
dr.setDaemon(True)
dr.start()
dr.join()
rr.join()
process.wait()
リーダー機能が(何らかの方法で進捗情報を更新する、あなたのケースでは)一般的に、彼らが読んでいるものに基づいて正しいことを行う囲むクラスのメソッドですです。
whileループを壊した後にデータが到着したらどうなりますか? – Neo
@Neo:彼の例はEOFで壊れています。これは、それ以降はデータが到着しないことを意味します。しかし、あなたの質問の含意に答える:stdoutパイプを読み続けることができない場合、バッファがいっぱいになり、サブプロセスがstdoutを書き込もうとするのをブロックします。 – payne
p.stdoutで後で使用するのを待っています。しかし、新しい入力が到着するかパイプが閉じるまで、readlineコールはブロックされます。サンプルスクリプトをいくつか追加しました。 – chmullig