社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

python bash のコマンドを実行

調べてみると色んなやり方が見つかりましたが、自分にとって一番シンプルだったやり方を。

import subprocess

bashCommand = "ls -alt"
output = subprocess.Popen(bashCommand, stdout=subprocess.PIPE, shell=True).communicate()[0]
print(output)
コマンドの意味とか

subprocess.Popen
新しいプロセスで子のプログラムを実行してくれる。

stdout=subprocess.PIPE
標準出力をパイプする。コンソールに表示させない。
communicate() はタプル (stdoutdata, stderrdata) を返す。
戻り値のタプルから None ではない値を取得するためには、 stdout=PIPE または stderr=PIPE を指定しなければならない。

shell=True
shell が True なら、指定されたコマンドはシェルによって実行される。

Popen.communicate(input)
プロセスと通信する。
end-of-file に到達するまでデータを stdin に送信し、stdout および stderr からデータを受信する。
オプション引数 input には子プロセスに送られる文字列か、あるいはデータを送らない場合は None を指定する。
受信したデータはメモリにバッファされるため、返されるデータが大きい場合はこのメソッドを使うべきではない。

結果
$ ls -alt
合計 12
drwxrwxr-x 2 xx xx 4096  6月 25 23:18 .
-rw-rw-r-- 1 xx xx  339  6月 25 23:18 execBashCommand.py
drwxrwxr-x 9 xx xx 4096  6月 25 22:40 ..
$ python execBashCommand.py 
合計 12
drwxrwxr-x 2 xx xx 4096  6月 25 23:22 .
-rw-rw-r-- 1 xx xx  309  6月 25 23:22 execBashCommand.py
drwxrwxr-x 9 xx xx 4096  6月 25 22:40 ..

普通に bash で実行したコマンドと同じ結果が得られた。
今回、stdout が欲しいから、communicate()[0] としている。
もし、communicate()[1] とした場合

$ python execBashCommand.py 
None

stderr の値が(実際には存在しないから None)が出力されている。