Difference between revisions of "Python:Template"
Jump to navigation
Jump to search
(19 intermediate revisions by the same user not shown) | |||
Line 8: | Line 8: | ||
<syntaxhighlight lang=python> | <syntaxhighlight lang=python> | ||
+ | #!/usr/bin/env python | ||
def usage(): | def usage(): | ||
Line 13: | 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 28: | ||
# END USER CONFIGURABLE ITEMS, DO NOT CHANGE ANYTHING BELOW THIS LINE | # END USER CONFIGURABLE ITEMS, DO NOT CHANGE ANYTHING BELOW THIS LINE | ||
− | import os | + | |
+ | 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 | from datetime import datetime | ||
− | timestamp = datetime.now().strftime("% | + | 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() | |
+ | openlog(<apath>) | ||
+ | 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 | ||
+ | |||
def openfile(filespec): | def openfile(filespec): | ||
Line 46: | Line 62: | ||
with open (filename,"r") as file: | with open (filename,"r") as file: | ||
for line in file: | for line in file: | ||
+ | #remove newline characters | ||
+ | line.rstrip('\r\n') | ||
<codeblock> | <codeblock> | ||
return | return | ||
− | def | + | 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: | 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() | main() | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Logging suggestion to test: | ||
+ | <syntaxhighlight lang=python> | ||
+ | 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 | ||
</syntaxhighlight> | </syntaxhighlight> |
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