1

私は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ですか?

  1. プログラムの別のPopenで、サービスを後ろで開いたままにしようとしたので、別のスレッドを使用して実行します。すべてのタスクが完了したら、このスレッドに終了するように通知し、明示的にPopen.kill()を呼び出してサービスを停止します。しかし、私のシステムは、刈り取られていないゾンビプロセスで終わります。終了後にこのバックグラウンドスレッドのすべてをクリーンアップする良い方法があるかどうかわかりませんか?

  2. Popen.communicate()[0]とPopen.stdout.readline()の違いは何ですか?ループを使用して、両方からの出力を読み取り続けることはできますか?

4

2 に答える 2

4

次のようにすると、例が機能します。

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)

for line in grepExec.stdout:
    # do something with line

プロセスに何らかの入力を与え、同時にプロセスの stdout、stderr ですべての出力を読み取りたい場合は、communication を使用します。これはおそらく、あなたのケースに必要なものではありません。communicateアプリケーションを起動し、必要なすべての入力をアプリケーションに送り、その出力を読み取りたい場合に適しています。

他の回答が指摘しているshell=Trueように、サブプロセスへの呼び出しでパイプラインを作成するために使用できますが、私が好む代替手段は、python を活用し、パイプラインを設定する代わりに次のことを行うことです。

checkCmd = ["sudo", "pyrit", "-r", self.capFile, "analyze"]
checkExec = Popen(checkCmd, shell=False, stdout=PIPE, stderr=STDOUT)
for line in checkExec.stdout:
    if line.find('good') != -1:
        do something with the matched line here
于 2012-04-23T19:40:32.587 に答える
2

popen の代わりに subprocess を使用すると、完全なコマンドラインで物事を大幅に簡素化できます。

http://docs.python.org/library/subprocess.html

例えば。

import subprocess as sub
f = open('/dev/null', 'w')
proc = sub.call("cat file | grep string", executable="/bin/bash", shell=True)
于 2012-04-23T19:32:15.933 に答える