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
としながら、安全にシェルコマンドをパイプして実行するコード例を紹介しました。
コメントを送る
コメントはブログオーナーのみ閲覧できます