Difference between revisions of "Python:Template"

From wiki
Jump to navigation Jump to search
Line 18: Line 18:
  
  
# USER CONFIGURABLE ITEMS
+
# USER CONFIGURABLE ITEMS (use this or a config file (see getconfig function)
  
 
warning = 'If you need to modify these variables anywhere else you have to declare it global there'
 
warning = 'If you need to modify these variables anywhere else you have to declare it global there'
Line 36: Line 36:
  
 
logfile2name = logfile2name.replace('timestamp',timestamp)
 
logfile2name = logfile2name.replace('timestamp',timestamp)
 +
 +
config = get_config(scriptname = __file__)
  
 
def main():
 
def main():
Line 65: Line 67:
 
     logging.info(logfilename+" open.")
 
     logging.info(logfilename+" open.")
 
     return(logfilename)
 
     return(logfilename)
 +
 +
 +
def get_config(scriptname = '' ,rcfile = None):
 +
    '''Read configuration from a given rcfile or from a configuration file in ./, ../etc, ./etc or /etc '''
 +
    import os
 +
    import re   
 +
    config = {}
 +
    if rcfile:
 +
        pass
 +
    else:
 +
        rcfile = re.sub('\.py$','.rc',scriptname)
 +
        if os.path.isfile(rcfile):
 +
            pass
 +
        else:
 +
            rcfile = rcfile.replace('/bin/','/etc/')
 +
            if os.path.isfile(rcfile):
 +
                pass
 +
            else:
 +
                scriptpath = os.path.dirname(scriptname)
 +
                rcfilename = os.path.basename(rcfile)
 +
                rcfile = scriptpath+'/etc/'+rcfilename
 +
                if os.path.isfile(rcfile):
 +
                    pass
 +
                else:
 +
                    rcfile = '/etc/'+rcfilename
 +
    if os.path.isfile(rcfile):
 +
        with open ( rcfile, "r") as file:
 +
            for line in file:
 +
                line = re.sub('\#.*$','',line).strip()
 +
                s = re.search('\s*=+\s*',line)
 +
                if s:
 +
                    parameter = line[:s.start()]
 +
                    value = line[s.end():]
 +
                    if value[0] == '[' and value[-1] == ']':
 +
                        tmplist = list(value[1:-1].split(','))
 +
                        value = []
 +
                        for val in tmplist:
 +
                            val = val.strip(' \'\"')
 +
                            value.append(val)
 +
                    config[parameter] = value
 +
    else:
 +
        print("No configuration file found")
 +
 +
    return config
  
  

Revision as of 12:42, 9 August 2020

Template for Python programs. Creating logfiles, standard modules to load, opening files, user configuration.

Code for mailing is on this wiki too.

ToDO:

  • Parsing commandline options
#!/usr/bin/env python

def usage():
    print ("Usage: "+__file__)
    print("Template for python programs")
    version = 'R1A, 20181010, Initial release'
    print("Version: "+version)
    sys.exit(1)


# USER CONFIGURABLE ITEMS (use this or a config file (see getconfig function)

warning = 'If you need to modify these variables anywhere else you have to declare it global there'
filespec =  '*.*'
logfile2name = '<apath>_timestamp.txt'

# END USER CONFIGURABLE ITEMS, DO NOT CHANGE ANYTHING BELOW THIS LINE

import os
import sys
import re
import glob
import logging
from collections import defaultdict
from datetime import datetime
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")

logfile2name = logfile2name.replace('timestamp',timestamp)

config = get_config(scriptname = __file__)

def main():
    logfilename = openlog()
    openlog(<apath>)
    logging.info("This is in the logfile with generated name")
    openfile(filespec)

    return


def openfile(filespec):
    filelist = glob.glob(filespec)
    for filename in filelist:
        if os.path.isfile(filename):
            with open (filename,"r") as file:
                for line in file:
                    #remove newline characters
                    line.rstrip('\r\n')
                    <codeblock>
    return


def openlog (logfilename = ''):
    if logfilename == '':
        logfilename = re.sub('/bin/','/log/',__file__)
        logfilename += '_'+timestamp+'.log'
    logging.basicConfig(filename=logfilename,level=logging.DEBUG,format='%(asctime)s %(levelname)7s %(message)s')
    logging.info(logfilename+" open.")
    return(logfilename)


def get_config(scriptname = '' ,rcfile = None):
    '''Read configuration from a given rcfile or from a configuration file in ./, ../etc, ./etc or /etc '''
    import os
    import re    
    config = {}
    if rcfile:
        pass
    else:
        rcfile = re.sub('\.py$','.rc',scriptname)
        if os.path.isfile(rcfile):
            pass
        else:
            rcfile = rcfile.replace('/bin/','/etc/')
            if os.path.isfile(rcfile):
                pass
            else:
                scriptpath = os.path.dirname(scriptname)
                rcfilename = os.path.basename(rcfile)
                rcfile = scriptpath+'/etc/'+rcfilename
                if os.path.isfile(rcfile):
                    pass
                else:
                    rcfile = '/etc/'+rcfilename
    if os.path.isfile(rcfile):
        with open ( rcfile, "r") as file:
            for line in file:
                line = re.sub('\#.*$','',line).strip()
                s = re.search('\s*=+\s*',line)
                if s:
                    parameter = line[:s.start()]
                    value = line[s.end():]
                    if value[0] == '[' and value[-1] == ']':
                        tmplist = list(value[1:-1].split(','))
                        value = []
                        for val in tmplist:
                            val = val.strip(' \'\"')
                            value.append(val)
                    config[parameter] = value
    else:
        print("No configuration file found")

    return config


main()

Logging suggestion to test:

def logfunc(logFile):  
    logging.basicConfig(format = '%(asctime)s %(filename)25s %(levelname)6s : %(message)s' , level=logging.INFO)  
    log = logging.getLogger()  
    fh = logging.FileHandler(logFile)  
    formatter = logging.Formatter('%(asctime)s %(filename)25s %(levelname)6s : %(message)s')  
    fh.setFormatter(formatter)  
    log.addHandler(fh)  
    return log