pythonの中にshellコマンドを実行できるやつ(subprocess)


今回はpythonの中にshellコマンドを実行できるライブラリと、それのよく使うやり方。またそれを使ってできる技など、丁寧に紹介します。

subprocess

それはsubprocessというライブラリです。一般的に下のようにインポートします

# ライブラリのインポート
import subprocess as sp
sp.call("ここにshellのコマンド",shell=True)

実行例

// 今のsubprocessディレクトリにはtestフォルダとsub.pyが入っている
subprocess % ls
#     sub.py      test/

//sub.pyの中身
subprocess % cat sub.py
#  import subprocess as sp
#  sp.call("midir test2",shell=True)

// sub.py 実行
subprocess % python sub.py

// 確認
subprocess % ls
#   sub.py  test/   test2/

## test2フォルダが作られている

subprocessの応用

google corabやpipyに登録するpythonファイルなど、ローカルpcと繋げない時に用いる。 また、データだけ撮ってきて、最後にそのファイルを消したい時も使える。

この気象省の2020年の気象データをsubprocessからダウンロード
http://www.data.jma.go.jp/obd/stats/etrn/index.php

subprocess % cat sub2.py 
import subprocess as sp
sp.call("wget http://www.data.jma.go.jp/obd/stats/etrn/index.php?prec_no=&block_no=&year=2020",shell=True)

// python実行 wgetが実行された
subprocess % python sub2.py
#--2021-11-13 13:05:47--  http://www.data.jma.go.jp/obd/stats/etrn/index.php?prec_no=
#www.data.jma.go.jp (www.data.jma.go.jp) をDNSに問いあわせています... 104.71.166.219
#www.data.jma.go.jp (www.data.jma.go.jp)|104.71.166.219|:80 に接続しています... 接続しました。
#HTTP による接続要求を送信しました、応答を待っています... 200 OK
#長さ: 23860 (23K) [text/html]
#`index.php?prec_no=' に保存中

#index.php?prec_no=  100%[===================>]  23.30K   123KB/s 時間 0.2s     

#2021-11-13 13:05:49 (123 KB/s) - `index.php?prec_no=' へ保存完了 [23860/23860]

ファイル削除

// 確認
subprocess % ls
#  index.php?prec_no=   sub2.py         test/
#  sub.py           sub3.py         test2/

subprocess % cat sub3.py
import subprocess as sp
sp.call("rm index.php?prec_no=",shell=True)

// 
subprocess % python sub3.py
subprocess % ls
#  sub2.py         test/
#  sub.py          sub3.py         test2/

まとめ

subprocessを用いればpythonファイル一つでデータをダウンロードし、データを整形し、結果を出力してデータを削除するところまでを行える