私は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()の違いは何ですか?ループを使用して、両方からの出力を読み取り続けることはできますか?