Difference between revisions of "Python:Template"
Jump to navigation
Jump to search
(9 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 35: | Line 41: | ||
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 60: | Line 70: | ||
def openlog (logfilename = ''): | def openlog (logfilename = ''): | ||
if logfilename == '': | if logfilename == '': | ||
− | logfilename = | + | logfilename = __file__.replace('/bin/', '/log/') |
logfilename += '_'+timestamp+'.log' | logfilename += '_'+timestamp+'.log' | ||
− | logging.basicConfig(filename=logfilename,level=logging.DEBUG,format='%(asctime)s %(levelname)7s %(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