#!/usr/bin/env python # python3 status: compatible # system libraries import sys, os, glob # AFNI libraries from afnipy import afni_util as UTIL from afnipy import option_list as OL # ---------------------------------------------------------------------- # globals g_help_string = """ ============================================================================= skeleton.py - skeleton of a basic python program This is merely a reasonable place to start a new program. ------------------------------------------ examples: ------------------------------------------ terminal options: -help : show this help -hist : show the revision history -ver : show the version number ------------------------------------------ process options: -infiles : specify input files ------------------------------------------ R Reynolds January 2015 ============================================================================= """ g_todo = """ todo list: - write actual program """ g_history = """ skeleton.py history: 0.0 Jan 13, 2015 - initial version 0.1 Aug 12, 2019 - python3 compatible """ g_version = "skeleton.py version 0.1, Aug 12, 2019" class MyInterface: """interface class for MyLibrary (whatever that is) """ def __init__(self, verb=1): # main variables self.valid_opts = None self.user_opts = None # control self.verb = 1 # infile name parsing self.infiles = [] # initialize valid_opts self.valid_opts = self.get_valid_opts() def get_valid_opts(self): vopts = OL.OptionList('valid opts') # short, terminal arguments vopts.add_opt('-help', 0, [], helpstr='display program help') vopts.add_opt('-hist', 0, [], helpstr='display the modification history') vopts.add_opt('-ver', 0, [], helpstr='display the current version number') # general options vopts.add_opt('-infiles', -1, [], helpstr='specify input files') vopts.add_opt('-verb', 1, [], helpstr='set the verbose level (def=1)') vopts.sort() return vopts def process_options(self): """return 1 on valid and exit return 0 on valid and continue return -1 on invalid """ argv = sys.argv # process any optlist_ options self.valid_opts.check_special_opts(argv) # process terminal options without the option_list interface # (so that errors are not reported) # if no arguments are given, do default processing if '-help' in argv or len(argv) < 2: print(g_help_string) return 1 if '-hist' in argv: print(g_history) return 1 if '-show_valid_opts' in argv: self.valid_opts.show('', 1) return 1 if '-ver' in argv: print(g_version) return 1 # ============================================================ # read options specified by the user self.user_opts = OL.read_options(argv, self.valid_opts) uopts = self.user_opts # convenience variable if not uopts: return -1 # error condition # ------------------------------------------------------------ # process verb first val, err = uopts.get_type_opt(int, '-verb') if val != None and not err: self.verb = val # ------------------------------------------------------------ # process options sequentially, to make them like a script errs = 0 for opt in self.user_opts.olist: # check for anything to skip if opt.name == '-verb': pass elif opt.name == '-infiles': self.infiles, err = uopts.get_string_list('', opt=opt) if self.infiles == None or err: print('** failed to read -infiles list') errs +=1 # allow early and late error returns if errs: return -1 # ------------------------------------------------------------ # apply any trailing logic if len(self.infiles) < 1: print('** missing -infiles option') errs += 1 if errs: return -1 return 0 def do_stuff(self): """main function to process input """ print('-- have %d files to process' % len(self.infiles)) errs = 0 # check file existence first for ifile in self.infiles: if ifile in ['-', 'stdin']: pass elif not os.path.isfile(ifile): print('** input file not found: %s' % ifile) errs += 1 if errs: return 1 return 0 def main(): me = MyInterface() if not me: return 1 rv = me.process_options() if rv > 0: return 0 # exit with success if rv < 0: # exit with error status print('** failed to process options...') return 1 if me.do_stuff(): return 1 return 0 if __name__ == '__main__': sys.exit(main())