Flaskを使ってみる

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


前回、pythonでarmbianmonitorのクローンを作りまし た。
そこで、前回のプログラムを少しだけ改造してみます。
monitor2.pyでは表示データを一旦、フォーマッターで変数に変換し、変換後の変数を表示していましたが、
monitor3.pyでは変換後の変数を、一旦リスト変数の配列に格納し、リスト変数の配列を一気に表示しています。

フォーマッターで変換した変数をaddItem関数で全てITEMSにため込んでいます。
ため込んだデータが一杯になると、shiftItem関数で一番古いデータを消して、以降のデータをシフトします。
ITEMS[1]→ITEMS[0]
ITEMS[2]→ITEMS[1]
ITEMS[3]→ITEMS[2]
・・
最新データ→ITEMS[9]

<monitor3.py>
#!/usr/bin/env python
#-*- encoding: utf-8 -*-

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

ITEMC = 0
ITEMS = {
  0 : {'time' : '', 'cpu' : '', 'item1' : '' , 'item2' : '',  'item3' : '', 'item4' : '', 'item5' : '', 'item6' : '', 'item7' : '', 'temp1' : '', 'temp2' : ''},
  1 : {'time' : '', 'cpu' : '', 'item1' : '' , 'item2' : '',  'item3' : '', 'item4' : '', 'item5' : '', 'item6' : '', 'item7' : '', 'temp1' : '', 'temp2' : ''},
  2 : {'time' : '', 'cpu' : '', 'item1' : '' , 'item2' : '',  'item3' : '', 'item4' : '', 'item5' : '', 'item6' : '', 'item7' : '', 'temp1' : '', 'temp2' : ''},
  3 : {'time' : '', 'cpu' : '', 'item1' : '' , 'item2' : '',  'item3' : '', 'item4' : '', 'item5' : '', 'item6' : '', 'item7' : '', 'temp1' : '', 'temp2' : ''},
  4 : {'time' : '', 'cpu' : '', 'item1' : '' , 'item2' : '',  'item3' : '', 'item4' : '', 'item5' : '', 'item6' : '', 'item7' : '', 'temp1' : '', 'temp2' : ''},
  5 : {'time' : '', 'cpu' : '', 'item1' : '' , 'item2' : '',  'item3' : '', 'item4' : '', 'item5' : '', 'item6' : '', 'item7' : '', 'temp1' : '', 'temp2' : ''},
  6 : {'time' : '', 'cpu' : '', 'item1' : '' , 'item2' : '',  'item3' : '', 'item4' : '', 'item5' : '', 'item6' : '', 'item7' : '', 'temp1' : '', 'temp2' : ''},
  7 : {'time' : '', 'cpu' : '', 'item1' : '' , 'item2' : '',  'item3' : '', 'item4' : '', 'item5' : '', 'item6' : '', 'item7' : '', 'temp1' : '', 'temp2' : ''},
  8 : {'time' : '', 'cpu' : '', 'item1' : '' , 'item2' : '',  'item3' : '', 'item4' : '', 'item5' : '', 'item6' : '', 'item7' : '', 'temp1' : '', 'temp2' : ''},
  9 : {'time' : '', 'cpu' : '', 'item1' : '' , 'item2' : '',  'item3' : '', 'item4' : '', 'item5' : '', 'item6' : '', 'item7' : '', 'temp1' : '', 'temp2' : ''}
   }

def addItem(time,cpu,item1,item2,item3,item4,item5,item6,item7,temp1,temp2):
  global ITEMC
#  print "ITEMC:" + str(ITEMC)
  if ITEMC == len(ITEMS):
    shiftItem()
    ITEMC = ITEMC-1
  ITEMS[ITEMC]['time'] = time
  ITEMS[ITEMC]['cpu'] = cpu
  ITEMS[ITEMC]['item1'] = item1
  ITEMS[ITEMC]['item2'] = item2
  ITEMS[ITEMC]['item3'] = item3
  ITEMS[ITEMC]['item4'] = item4
  ITEMS[ITEMC]['item5'] = item5
  ITEMS[ITEMC]['item6'] = item6
  ITEMS[ITEMC]['item7'] = item7
  ITEMS[ITEMC]['temp1'] = temp1
  ITEMS[ITEMC]['temp2'] = temp2
  ITEMC = ITEMC + 1

  for i in ITEMS:
#    print "i=" + str(i),
    print ITEMS[i]['time'],
    print ITEMS[i]['cpu'],
    print ITEMS[i]['item1'],
    print ITEMS[i]['item2'],
    print ITEMS[i]['item3'],
    print ITEMS[i]['item4'],
    print ITEMS[i]['item5'],
    print ITEMS[i]['item6'],
    print ITEMS[i]['item7'],
    print ITEMS[i]['temp1'],
    print ITEMS[i]['temp2'],
    print


def shiftItem():
  for i in range(len(ITEMS)-1):
    ITEMS[i]['time'] = ITEMS[i+1]['time']
    ITEMS[i]['cpu'] = ITEMS[i+1]['cpu']
    ITEMS[i]['item1'] = ITEMS[i+1]['item1']
    ITEMS[i]['item2'] = ITEMS[i+1]['item2']
    ITEMS[i]['item3'] = ITEMS[i+1]['item3']
    ITEMS[i]['item4'] = ITEMS[i+1]['item4']
    ITEMS[i]['item5'] = ITEMS[i+1]['item5']
    ITEMS[i]['item6'] = ITEMS[i+1]['item6']
    ITEMS[i]['item7'] = ITEMS[i+1]['item7']
    ITEMS[i]['temp1'] = ITEMS[i+1]['temp1']
    ITEMS[i]['temp2'] = ITEMS[i+1]['temp2']

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()
  time = '{0:02d}:{1:02d}:{2:02d}:'.format(d.hour, d.minute, d.second)
#  print time,
  cpu = '{0:>4s}MHz'.format(CpuFreq)
#  print cpu,
  item1 = '{0:>5s}'.format(LoadAvg)
#  print item1,
  item2 = '{0:>3s}%'.format(CPULoad)
#  print item2,
  item3 = '{0:>3s}%'.format(SystemLoad)
#  print item3,
  item4 = '{0:>3s}%'.format(UserLoad)
#  print item4,
  item5 = '{0:>3s}%'.format(NiceLoad)
#  print item5,
  item6 = '{0:>3s}%'.format(IOWaitLoad)
#  print item6,
  item7 = '{0:>3s}%'.format(IrqCombinedLoad)
#  print item7,
  temp1=''
  if SocTemp > 0:
    temp1 = '{0:>4s}°C'.format(SocTemp)
#    print temp1,
  temp2=''
  if PMICTemp > 0:
    temp2 = '{0:>4s}°C'.format(MPICTTemp)
#    print temp2,
#  print
 
  addItem(time,cpu,item1,item2,item3,item4,item5,item6,item7,temp1,temp2)

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


if __name__ == "__main__":
   main()

実行結果は前回とかなりイメージが変わり、10行単位の表示となります。


次回
はこのプログラムをいよいよブラウザー対応に改造しま す。