Difference between revisions of "Python:Template"

From wiki
Jump to navigation Jump to search
 
(11 intermediate revisions by the same user not shown)
Line 14: Line 14:
 
     print("Template for python programs")
 
     print("Template for python programs")
 
     version = 'R1A, 20181010, Initial release'
 
     version = 'R1A, 20181010, Initial release'
 +
    version = 'v02, 20211229, Last update (counters added)'
 
     print("Version: "+version)
 
     print("Version: "+version)
 
     sys.exit(1)
 
     sys.exit(1)
  
  
# USER CONFIGURABLE ITEMS
+
# USER CONFIGURABLE ITEMS (use this or a config file (see getconfig function))
  
 +
testing = 0
 
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'
 
filespec =  '*.*'
 
filespec =  '*.*'
Line 25: Line 27:
  
 
# END USER CONFIGURABLE ITEMS, DO NOT CHANGE ANYTHING BELOW THIS LINE
 
# END USER CONFIGURABLE ITEMS, DO NOT CHANGE ANYTHING BELOW THIS LINE
 +
 +
 +
if testing:
 +
    print('Running {} in testing mode'.format(__file))
  
 
import os
 
import os
Line 31: Line 37:
 
import glob
 
import glob
 
import logging
 
import logging
 +
from collections import defaultdict
 
from datetime import datetime
 
from datetime import datetime
 
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
 
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
  
logfile2name = logfile2name.replace('timestamp',timestamp)
+
logfile2name = logfile2name.replace('timestamp', timestamp)
 +
counters = defaultdict(int)
  
 
def main():
 
def main():
 +
    config = get_config(scriptname = __file__)
 
     logfilename = openlog()
 
     logfilename = openlog()
 
     openlog(<apath>)
 
     openlog(<apath>)
 
     logging.info("This is in the logfile with generated name")
 
     logging.info("This is in the logfile with generated name")
 
     openfile(filespec)
 
     openfile(filespec)
 +
    for counter, value in counters.items():
 +
        print('{:10s} {:5d}'.format(counter, value)
  
 
     return
 
     return
Line 59: Line 70:
 
def openlog (logfilename = ''):
 
def openlog (logfilename = ''):
 
     if logfilename == '':
 
     if logfilename == '':
         logfilename = re.sub('/bin/','/log/',__file__)
+
         logfilename = __file__.replace('/bin/', '/log/')
 
         logfilename += '_'+timestamp+'.log'
 
         logfilename += '_'+timestamp+'.log'
     logging.basicConfig(filename=logfilename,level=logging.DEBUG,format='%(asctime)s %(message)s')
+
    if testing:
 +
        logfilename = logfilename+'_testing'
 +
     logging.basicConfig(filename=logfilename, level=logging.DEBUG,format='%(asctime)s %(levelname)7s %(message)s')
 
     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
  
  

Latest revision as of 11:44, 29 December 2021

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'
    version = 'v02, 20211229, Last update (counters added)'
    print("Version: "+version)
    sys.exit(1)


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

testing = 0
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


if testing:
    print('Running {} in testing mode'.format(__file))

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)
counters = defaultdict(int)

def main():
    config = get_config(scriptname = __file__)
    logfilename = openlog()
    openlog(<apath>)
    logging.info("This is in the logfile with generated name")
    openfile(filespec)
    for counter, value in counters.items():
        print('{:10s} {:5d}'.format(counter, value)

    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 = __file__.replace('/bin/', '/log/')
        logfilename += '_'+timestamp+'.log'
    if testing:
        logfilename = logfilename+'_testing'
    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