Pythonでパイプを含むコマンド実行を手軽に行う
はじめに
Pythonで「パイプを含むコマンド」を実行する方法が分かりづらかったため、手軽に行う方法を簡単にメモ。
参考: 17.1. subprocess ― サブプロセス管理
方法
以下をテンプレートとする。commandに「実行したいパイプを含むコマンド」を宣言する。
他(#1~#3)は状況に応じて書き換える。基本的にこのままで使えると思う。
import subprocess command = "ls -la | sort -r" #!ここに実行したいコマンドを書く! proc = subprocess.Popen( command, shell = True, #シェル経由($ sh -c "command")で実行。 stdin = subprocess.PIPE, #1 stdout = subprocess.PIPE, #2 stderr = subprocess.PIPE) #3 stdout_data, stderr_data = proc.communicate() #処理実行を待つ(†1) print stdout_data #標準出力の確認 print stderr_data #標準エラーの確認
#1~#3: リダイレクトをどうするか。標準エラーを標準出力として扱う設定などがここでできる。上の例だと、標準出力は標準出力、標準エラーは標準エラー、標準入力は標準入力として扱う。
†1: 別の処理を待つ方法として、proc.wait()し、proc.stdout.read()する方法があるが、これは使用すべきではない。標準出力のデータ量が多い場合、デッドロックとなり、処理が返ってこなくなる可能性がある。詳細はPython の subprocess で出力を受け取るときは communicate() を使おう