実行中のプロセスのstdout
を定期的にチェックする必要がある場合は、たとえば、プロセスはtail -f /tmp/file
で、これはpythonスクリプトで生成されます。次に、x秒ごとに、そのサブプロセスのstdoutが文字列に書き込まれ、さらに処理されます。サブプロセスは最終的にスクリプトによって停止されます。Pythonで実行中のサブプロセスのstdoutを確認する
サブプロセスのstdoutを解析するには、今までcheck_output
を使用していますが、これは動作していないようです。プロセスがまだ実行中であり、明確な出力が得られないためです。
>>> from subprocess import check_output
>>> out = check_output(["tail", "-f", "/tmp/file"])
#(waiting for tail to finish)
複数のサブプロセスの出力を処理することができるように、(例えば尾-f/TMP/FILE1、尾-f/TMP/FILE2)、サブプロセスのためのスレッドを使用することが可能であるべきです。
サブプロセスを開始し、その標準出力を定期的にチェックして処理し、最終的にはマルチスレッドのやり方でサブプロセスを停止できますか? pythonスクリプトはLinuxシステム上で動作します。
目標はファイルを連続的に読み取ることではなく、tailコマンドは使用される実際のコマンドとまったく同じように動作するため、例です。
編集:私はこれまで考えていなかったが、ファイルが存在しなかった。 check_output
は、プロセスが完了するのを単に待つだけです。
edit2:代替方法は、Popen
とPIPE
と同じ問題が発生しているようです。 tail
が終了するのを待ちます。
>>> from subprocess import Popen, PIPE, STDOUT
>>> cmd = 'tail -f /tmp/file'
>>> p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
>>> output = p.stdout.read()
#(waiting for tail to finish)
http://stackoverflow.com/a/6482200/1866177はおそらくこの問題を解決します。 – Dschoni
あなたの例はstdoutを読むことができないよりも大きな問題があります。それを修正してください。 –
@Dschoni、OPは出力をリダイレクトせずに取り込みしようとしています。これにより、あなたが提供したリンクよりも少し完成したものになります。 –