Flaskを使ってみる

pythonスクリプトのWEB対応 その1


Flaskを使えばpythonで書かれたプログラムを簡単にブラウザー対応にすることができます。
Flaskについては色々なところで紹介されていますが、PythonのWebフレームワークの1つです。
そこで、何回かに分けて、pythonで書かれたプログラムをブラウザー対応にする手順を紹介します。

今回選んだ例題はArmbianのモニターリングツールのarmbianmonitorです。
armbianmonitorをコマンドラインから実行すると、CPU周波数や温度などの情報が一定間隔で表示されます。


armbianmonitorのソース(シェルファイル)はこ ちらで公開されています。
そこで、CPU周波数や温度などの情報表示を行う部分(MonitorMode関数)だけをpythonに移植してみます。
移植したコード(monitor1.py)は以下のようになります。
#!/usr/bin/env python
#-*- encoding: utf-8 -*-

import commands
import os.path
import datetime
import locale
import time
import signal

def handler(signum, frame):
  global EndFlag
  EndFlag = 0

def ProcessStats():
  global LoadAvg
  global CpuFreq
  global SocTemp
  global PMICTemp
  global CPULoad
  global SystemLoad
  global UserLoad
  global NiceLoad
  global IOWaitLoad
  global IrqCombinedLoad

  LoadAvg = commands.getoutput("cut -f1 -d ' ' </proc/loadavg")
  CpuFreq = commands.getoutput("awk '{printf (\"%0.0f\",$1/1000); }' </sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq")

  Sensors="/etc/armbianmonitor/datasources/"
  SocTemp = 0
  path=Sensors + "soctemp"
  if os.path.isfile(path):
    SocTemp = commands.getoutput("cat " + path)
  PMICTemp = 0
  path=Sensors + "pmictemp"
  if os.path.isfile(path):
    PMICTemp = commands.getoutput("awk '{printf (\"%0.1f\",$1/1000); }' <" + path)

  CpuStat= commands.getoutput ("awk -F\" \" '{print$1\"\t\"$2\"\t\"$3\"\t\"$4\"\t\"$5\"\t\"$6}' </tmp/cpustat")
  list = CpuStat.split()
  CPULoad=list[0]
  SystemLoad=list[1]
  UserLoad=list[2]
  NiceLoad=list[3]
  IOWaitLoad=list[4]
  IrqCombinedLoad=list[5]    

def header():
  Sensors="/etc/armbianmonitor/datasources/"
  print "Stop monitoring using [ctrl]-[c]"
  print "Time        CPU    load %cpu %sys %usr %nice %io %irq",
  path=Sensors + "soctemp"
  if os.path.isfile(path):
    print "  CPU",
  path=Sensors + "pmictemp"
  if os.path.isfile(path):
    print "  PMIC",
  print

def display():
  ProcessStats()
  d = datetime.datetime.today()
  print '{0:02d}:{1:02d}:{2:02d}:'.format(d.hour, d.minute, d.second),
  print '{0:>4s}MHz'.format(CpuFreq),
  print '{0:>5s}'.format(LoadAvg),
  print '{0:>3s}%'.format(CPULoad),
  print '{0:>3s}%'.format(SystemLoad),
  print '{0:>3s}%'.format(UserLoad),
  print '{0:>3s}%'.format(NiceLoad),
  print '{0:>3s}%'.format(IOWaitLoad),
  print '{0:>3s}%'.format(IrqCombinedLoad),
  if SocTemp > 0:
    print '{0:>4s}°C'.format(SocTemp),
  if PMICTemp > 0:
    print '{0:>4s}°C'.format(MPICTemp),
  print

def main():
  global EndFlag
  EndFlag = 1
  signal.signal(signal.SIGINT, handler)
  header()
  while(EndFlag):
    display()
    time.sleep(5)


if __name__ == "__main__":
   main()

このプログラムを実行すると、armbianmonitorと同じ内容が表示されます。


最終的には、この表示をブラウザーで表示できるようにします。


次回はこのプログラム(monitor1.py)を少し改造します。