Python3でシェルコマンドを実行するにはsubprocessモジュールを使います。
シェルコマンドをパイプして実行する方法を検索すると、shell=Trueとして'command1 | command2'のように文字列で渡す例がよく出てきます。
しかしこの方法には、セキュリティ上考慮すべき点があることを忘れてはなりません。
shell=True でシェルを明示的に呼びだした場合、シェルインジェクション の脆弱性に対処するための、すべての空白やメタ文字の適切なクオートの保証はアプリケーションの責任になります。
このエントリではshell=Falseとしながら、安全にシェルコマンドをパイプして実行するコード例を紹介します。
echoしたテキストをjumanppコマンド(形態素解析システム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() 以上です。
このエントリではshell=Falseとしながら、安全にシェルコマンドをパイプして実行するコード例を紹介しました。
コメントを送る
コメントはブログオーナーのみ閲覧できます