Sponsored Link

(77) subprocessでパイプライン処理を実現

(77) subprocessでパイプライン処理を実現

この記事は最終更新から 378日 が経過しています。

(37) subprocessで外部のプログラムを実行では、subprocessモジュールを使って外部プログラムを実行する方法を記した。しかし、この方法だと「複数コマンドをパイプで繋いだ場合にうまく動かない」のであった…

これは OK

cmd1 = "ls -lt"
sp.call(cmd1.split(" "))

これは NOK

cmd1 = "ls -lt | grep txt"
sp.call(cmd1.split(" "))

ではどうするか?

cmd1 = "ls -lt"
cmd2 = "grep txt"
res = sp.Popen(cmd1.split(" "), stdout=sp.PIPE)
sp.check_output(cmd2.split(" "), stdin=res.stdout)

または、

cmd = "ls -lt | grep txt"
res = sp.Popen(cmd, shell=True, stdout=sp.PIPE)
stdout,strerr = res.communicate()
print stdout
cmd = "ls -lt | grep txt"
res = sp.Popen(cmd, shell=True, stdout=sp.PIPE)
res.communicate()[0]

しかし、shell=True は任意のコマンドを自由自在に操られてしまう危険性がある。
しっかりとサニタイズされていない外部入力データを使うならば shell=True を使ってはダメ!

Sponsored Link

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*