Die orginele code ziet er niet echt proper geschreven uit moet ik zeggen. Welke versie van Python wordt er hier gebruikt trouwens?
Met wat aanpassingen kan het een stuk duidelijker geschreven worden:
Code: Selecteer alles
import sys, time
from datetime import datetime
from daemon3x import daemon3x
from configparser import ConfigParser
import smaem
CONFIG_FILE_PATH = '/etc/smaemd/config'
def read_config(config_file_path):
#read configuration
parser = ConfigParser()
parser.read('/etc/smaemd/config')
smaemserials=parser.get('SMA-EM', 'serials')
serials=smaemserials.split(' ')
smavalues=parser.get('SMA-EM', 'values')
values=smavalues.split(' ')
pidfile=parser.get('DAEMON', 'pidfile')
return (pidfile, serials, values)
class MyDaemon(daemon3x):
def __init__(self, pid_file, sma_serials, sma_value_types):
super(MyDaemon, self).__init__(pid_file)
self.sma_serials = sma_serials
self.sma_value_types = sma_value_types
def run(self):
while True:
# Read the emparts & get the current time since that is the timestamp of the data
emparts = smaem.readem()
now = datetime.now()
# Only write the data if it has the requested serial
sma_serial = str(emparts.get('serial'))
if sma_serial in self.sma_serials:
for sma_value_type in self.sma_value_types:
with open("/run/shm/em-{}-{}".format(sma_serial, sma_value_type),"a") as fh:
fh.write("{:%Y-%m-%d %H:%M:%S} - {}\n".format(now, emparts.get(sma_value_type, "NA")))
if __name__ == "__main__":
pidfile, serials, values = read_config(CONFIG_FILE_PATH)
daemon = MyDaemon(pidfile, serials, values)
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
daemon.start()
elif 'stop' == sys.argv[1]:
daemon.stop()
elif 'restart' == sys.argv[1]:
daemon.restart()
else:
print ("Unknown command")
sys.exit(2)
sys.exit(0)
else:
print("usage: %s start|stop|restart" % sys.argv[0])
print(pidfile)
sys.exit(2)
Code: Selecteer alles
sma_serial = str(emparts.get('serial'))
if sma_serial in self.sma_serials:
...
De serial die je krijgt is in integer formaat. De normale manier om deze om te zetten in een string is de 'str()' functie te gebruiken. Snap niet waarom ze format() gebruiken zonder een format specifier dan nog.
Daarnaast gebruik je best de get() functie om de waardes uit de dict te lezen. Dit voorkomt dat je KeyError exception kan krijgen moest er iets ontbreken in de uitgelezen data.
Vermits er enkel wordt gekeken of de serial van de uitgeleesde data in de geconfigureerde serials zit, kan beter de 'in' constructie gebruikt worden.
Code: Selecteer alles
"{:%Y-%m-%d %H:%M:%S} - {}\n".format(now, emparts.get(sma_value_type, "NA"))
Je kan met de format functie rechtstreeks de date formatting gebruiken. Het tweede argument van de get functie geeft je een default waarde terug indien de key niet in de dict wordt gevonden.
Code: Selecteer alles
with open("/run/shm/em-{}-{}".format(sma_serial, sma_value_type),"a") as fh:
...
Ook wordt het beste de 'with' constructie gebruikt om bestanden te openen. Dit zorgt ervoor dat de file altijd gesloten wordt ook in het geval van exceptions. Deze functie is wel niet in alle Python versies beschikbaar.
PS. Deze code is niet getest dus kan nog fouten bevatten