アルパカログ

カスタマーサポート (CS) とエンジニアリングを掛け算したい CRE (Customer Reliability Engineer) が気になる技術や思ったことなど。

【Python3】パイプありのシェルコマンドを実行する

Python からシェルコマンドを実行するには subprocess モジュールを使うのが定石かと思います。

パイプありのシェルコマンドの実行方法を調べると、たいてい shell=True として 'command1 | command2' のような文字列を渡す例がよく出てきます。

しかし、この方法にはセキュリティで考慮すべき点があることを忘れてはなりません。

では shell=False で実行するにはどのように書けば良いでしょうか?

echo したテキストを Juman++ で形態素解析する例です。

まずは shell=True の方から。

from subprocess import Popen, PIPE

command = "echo '" + sentence.replace("'", "\'") + "' | jumanpp"
proc = Popen(command, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
stdout, stderr = proc.communicate()

これを shell=False にするには次のように書きます。

from subprocess import Popen, PIPE

p1 = Popen(['echo', sentence], stdout=PIPE)
p2 = Popen(['jumanpp'], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()
stdout, stderr = p2.communicate()

Dockerfile でもコマンドをリストで渡すので、後者の方が親しみやすいですね。

余談

Juman++ は v2.0.0-rc2 が開発版でリリースされていて、めちゃくちゃ高速なので Juman++ を使うなら v2 がおすすめです。

参考文献

あわせて読みたい

alpacat.hatenablog.com

alpacat.hatenablog.com