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)が出力されている。