Python Tips: ターミナルのコマンドを利用したい

Python上でターミナル(コマンドライン)のコマンドを利用できる機能についてご紹介します。

import subprocess

subprocess.call(cmd)
subprocess.check_call(cmd)
subprocess.check_output(cmd)

コマンド関連の機能はsubprocessの中にまとめられています。代表的なものはcall、check_call、check_outputの3つでしょうか。

subprocess.call('ls')
# ただ実行するだけ
# 結果ステータスを返す
# 0なら成功
subprocess.check_call('ls')
# call とほとんど同じだが
# エラーなら CalledProcessError 例外をあげてくれる
subprocess.check_output('ls')
# check_call とほとんど同じだが
# コマンドの標準出力を返す

callがいちばんシンプルで、check_call、check_outputになると機能が豊富になっていきます。callは実行してステータスを返すだけ、check_outputは出力を文字列で取得できエラーの例外処理もPython上で行うことができます。

例外処理や出力の再利用のことなんかを考えると、通常はcheck_outputを使うのが良さそうです。

コマンド関連の機能がsubprocessモジュールにまとめられる以前は、osモジュール内のos.systemやcommands内のgetstatusoutputなどがありましたが、現在では推奨されていないようです。

import os
os.system('ls')
# ステータスを返す
# subprocess.call('ls') に近いもの
import commands
commands.getstatusoutput('ls')
# ステータスと出力をリストにして返す
# subprocess.check_output('ls') に近いもの

その他、サブプロセスをもっと細かく扱いたい場合には、Python 3の場合はsubprocess.Popenクラス、Python 2の場合はpopen2モジュールを使うのがよいようです。

参考