私はPythonでPopenと数日間戦ってきたので、ここにすべての疑問を投げかけることにしました。Pythonの専門家がすべての疑問を明らかにできることを願っています。
最初は、Popenを使用してコマンドを実行し、結果をgrepします(パイプを使用した1つのコマンドとして、のようなものxxx | grep yyy
)。shell=False
ご想像のとおり、これはうまく機能しません。この投稿のガイドに従って、コードを次のように変更しました。
checkCmd = ["sudo", "pyrit", "-r", self.capFile, "analyze"]
checkExec = Popen(checkCmd, shell=False, stdout=PIPE, stderr=STDOUT)
grepExec = Popen(["grep", "good"], stdin=checkExec.stdout, stdout=PIPE)
output = grepExec.stdout.readline()
output = grepExec.communicate()[0]
checkExec
しかし、実行が遅く、Popenが非ブロッキングであるため、結果が表示grepExec
される前に常に実行されることに気付きましたcheckExec
。したがって、grep出力は常に空白になります。grepExec
終了するまで実行を延期するにはどうすればよいcheckExec
ですか?
プログラムの別のPopenで、サービスを後ろで開いたままにしようとしたので、別のスレッドを使用して実行します。すべてのタスクが完了したら、このスレッドに終了するように通知し、明示的にPopen.kill()を呼び出してサービスを停止します。しかし、私のシステムは、刈り取られていないゾンビプロセスで終わります。終了後にこのバックグラウンドスレッドのすべてをクリーンアップする良い方法があるかどうかわかりませんか?
Popen.communicate()[0]とPopen.stdout.readline()の違いは何ですか?ループを使用して、両方からの出力を読み取り続けることはできますか?