私はstdout.readline
を試して、結果を(つまり、端末に印刷した時点で)multiprocessing.Queue
の別の.pyファイルに入れてください。しかし、コール:PythonはPopenを継続的に読み取っています(Windows)
res = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=1)
with res.stdout:
for line in iter(res.stdout.readline, b''):
print line
res.wait()
はブロックされます、結果は(終了コードが返されていない場合または全くない)プロセスが完了した後に印刷されます。
私はこれに対する答えを閲覧し、bufsize = 1、読み込みを処理するスレッドを生成する、filedescriptorsなどを使用してみましたが、うまくいかないようです。私はモジュールpexpect
を使用しなければならないかもしれませんが、私はまだそれがどのように動作するのか分かりません。
私はまた、キューにデータを配置するには、しかしout.readline
をブロックするように思わ以来、結果は同じになります
def enqueue_output(self, out, queue):
for line in iter(out.readline, b''):
queue.put([line])
out.close()
を試してみました。
要約:印刷時にサブプロセス出力を私に利用可能にするにはどうすればよいですか?しかし、これらは私に返され、一度に1〜10行のチャンクを印刷し、プロセスが完了すると、
関連..だけでなく改行で区切ら:
Python subprocess readlines() hangs
Python: read streaming input from subprocess.communicate()
Non-blocking read on a subprocess.PIPE in python
バッファリングを無効にしたり、Pythonの "-u"や "-i"オプションなどの対話モードを使用するには、プログラムにコマンドラインオプションがあるかどうかを調べる必要があります。さもなければ、パイプであることがわかると、 'stdout'にバッファリングする可能性が高くなります。出力は、バッファがいっぱいになったとき、またはプログラムがバッファを手動でフラッシュするとき、または出力が終了したときにのみパイプに書き込まれます。パイプのもう一方の端にあるPythonは、この動作を制御しません。 – eryksun
あなたはpexpectに言及し、質問に "pty"というタグを付けましたが、Windowsには端末と擬似端末がありません。 pexpectに最も近いのはwinpexpectですが、それはパイプを使用しているので、バッファリングの問題は解決しません。これをWindowsで正しく処理するにはコンソールAPIが必要です。ウィンドウレスコンソールにヘルパープログラムを添付して、プログラムの出力を読み込んで入力に書き込むことがあります。私はWindows用にこれを実装するPythonモジュールを見たことがありません。 – eryksun
@eryksun ptyタグを削除しました。私はこの問題が私が呼んでいるプロセスにあるのではないかと恐れていました。責任ある開発者にそれを求めなければなりません。 Windowsを実行し、サブプロセスとコマンドライン機能を使用するときにバッファリングに関するいくつかの問題があるようです。 – enrm