どこでも見れるメモ帳

とあるSEの備忘録。何かあれば気軽にコメントください〜

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() を使おう