複数のパイプを含むコマンドを呼び出してPopen
、その出力を読み取れるようにする正しい方法は何ですか?私は試した:
Popen(shlex.split("mycmd arg1 | mysecondcmd - | thirdcmd -", stdout=PIPE)")
しかし、私はここにいるとは思いませんshlex.split
。正しい構文は何ですか?
複数のパイプを含むコマンドを呼び出してPopen
、その出力を読み取れるようにする正しい方法は何ですか?私は試した:
Popen(shlex.split("mycmd arg1 | mysecondcmd - | thirdcmd -", stdout=PIPE)")
しかし、私はここにいるとは思いませんshlex.split
。正しい構文は何ですか?
あなたにはいくつかのオプションがあります-あなたは渡すことができますshell=True
:
Popen('command1 | command2 | command3',shell=True)
または、ドキュメントPopen
に示されているように、stdoutを次のPopenのstdinにフックする一連の呼び出しに分割することもできます。
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
は、特に(悪意のある可能性のある)ユーザーによって提供されたコマンドを実行している場合、セキュリティリスク(「警告」ボックスまでのページダウン)になる可能性があるためです。