0

複数のパイプを含むコマンドを呼び出してPopen、その出力を読み取れるようにする正しい方法は何ですか?私は試した:

Popen(shlex.split("mycmd arg1 | mysecondcmd - | thirdcmd -", stdout=PIPE)")

しかし、私はここにいるとは思いませんshlex.split。正しい構文は何ですか?

4

2 に答える 2

6

あなたにはいくつかのオプションがあります-あなたは渡すことができますshell=True

Popen('command1 | command2 | command3',shell=True)

または、ドキュメントPopenに示されているように、stdoutを次のPopenのstdinにフックする一連の呼び出しに分割することもできます。

于 2013-01-28T18:31:07.100 に答える
2

shモジュールを使用すると、パイプは関数合成になります。

import sh
output = sh.thirdcmd(sh.mysecondcmd(sh.mycmd("arg1")))

なしのサブプロセスでそれを実行したい場合shell = Trueは、を使用してシェルパイプラインを作成する方法を示す例がドキュメントsubprocess.Popenにあります。sを正しく受信できるproc.stdoutように、sを閉じることになっていることに注意してください。SIGPIPE

import subprocess
proc1 = subprocess.Popen(shlex.split('mycmd arg1'), stdout = subprocess.PIPE)
proc2 = subprocess.Popen(shlex.split('mysecondcmd'), stdin = proc1.PIPE,
                         stdout = subprocess.PIPE)
proc3 = subprocess.Popen(shlex.split('thirdcmd'), stdin = proc2.PIPE,
                         stdout = subprocess.PIPE)

# Allow proc1 to receive a SIGPIPE if proc2 exits.
proc1.stdout.close()
# Allow proc2 to receive a SIGPIPE if proc3 exits.
proc2.stdout.close()
out, err = proc3.communicate()

これは、を使用するよりもはるかに多くの作業のように見える場合がありますshell = True。回避したい理由shell = Trueは、特に(悪意のある可能性のある)ユーザーによって提供されたコマンドを実行している場合、セキュリティリスク(「警告」ボックスまでのページダウン)になる可能性があるためです。

于 2013-01-28T18:46:35.327 に答える