1*7d68d00bSMichael Walsh#!/usr/bin/env python 2*7d68d00bSMichael Walsh 3*7d68d00bSMichael Walshr""" 4*7d68d00bSMichael Walshpython_pgm_template: Copy this template as a base to get a start on a python 5*7d68d00bSMichael Walshprogram. You may remove any generic comments (like this one). 6*7d68d00bSMichael Walsh""" 7*7d68d00bSMichael Walsh 8*7d68d00bSMichael Walshimport sys 9*7d68d00bSMichael Walsh 10*7d68d00bSMichael Walsh# python puts the program's directory path in sys.path[0]. In other words, 11*7d68d00bSMichael Walsh# the user ordinarily has no way to override python's choice of a module from 12*7d68d00bSMichael Walsh# its own dir. We want to have that ability in our environment. However, we 13*7d68d00bSMichael Walsh# don't want to break any established python modules that depend on this 14*7d68d00bSMichael Walsh# behavior. So, we'll save the value from sys.path[0], delete it, import our 15*7d68d00bSMichael Walsh# modules and then restore sys.path to its original value. 16*7d68d00bSMichael Walsh 17*7d68d00bSMichael Walshsave_path_0 = sys.path[0] 18*7d68d00bSMichael Walshdel sys.path[0] 19*7d68d00bSMichael Walsh 20*7d68d00bSMichael Walshfrom gen_arg import * 21*7d68d00bSMichael Walshfrom gen_print import * 22*7d68d00bSMichael Walshfrom gen_valid import * 23*7d68d00bSMichael Walsh 24*7d68d00bSMichael Walsh# Restore sys.path[0]. 25*7d68d00bSMichael Walshsys.path.insert(0, save_path_0) 26*7d68d00bSMichael Walsh 27*7d68d00bSMichael Walsh############################################################################### 28*7d68d00bSMichael Walsh# Create parser object to process command line parameters and args. 29*7d68d00bSMichael Walsh 30*7d68d00bSMichael Walsh# Create parser object. 31*7d68d00bSMichael Walshparser = argparse.ArgumentParser( 32*7d68d00bSMichael Walsh usage='%(prog)s [OPTIONS]', 33*7d68d00bSMichael Walsh description="%(prog)s will...", 34*7d68d00bSMichael Walsh formatter_class=argparse.RawTextHelpFormatter, 35*7d68d00bSMichael Walsh prefix_chars='-+') 36*7d68d00bSMichael Walsh 37*7d68d00bSMichael Walsh# Create arguments. 38*7d68d00bSMichael Walshparser.add_argument( 39*7d68d00bSMichael Walsh '--whatever', 40*7d68d00bSMichael Walsh help='bla, bla.') 41*7d68d00bSMichael Walsh 42*7d68d00bSMichael Walsh# The stock_list will be passed to gen_get_options. We populate it with the 43*7d68d00bSMichael Walsh# names of stock parm options we want. These stock parms are pre-defined by 44*7d68d00bSMichael Walsh# gen_get_options. 45*7d68d00bSMichael Walshstock_list = [("test_mode", 0), ("quiet", 0), ("debug", 0)] 46*7d68d00bSMichael Walsh############################################################################### 47*7d68d00bSMichael Walsh 48*7d68d00bSMichael Walsh 49*7d68d00bSMichael Walsh############################################################################### 50*7d68d00bSMichael Walshdef exit_function(signal_number=0, 51*7d68d00bSMichael Walsh frame=None): 52*7d68d00bSMichael Walsh 53*7d68d00bSMichael Walsh r""" 54*7d68d00bSMichael Walsh Execute whenever the program ends normally or with the signals that we 55*7d68d00bSMichael Walsh catch (i.e. TERM, INT). 56*7d68d00bSMichael Walsh """ 57*7d68d00bSMichael Walsh 58*7d68d00bSMichael Walsh dprint_executing() 59*7d68d00bSMichael Walsh dprint_var(signal_number) 60*7d68d00bSMichael Walsh 61*7d68d00bSMichael Walsh # Your cleanup code here. 62*7d68d00bSMichael Walsh 63*7d68d00bSMichael Walsh qprint_pgm_footer() 64*7d68d00bSMichael Walsh 65*7d68d00bSMichael Walsh############################################################################### 66*7d68d00bSMichael Walsh 67*7d68d00bSMichael Walsh 68*7d68d00bSMichael Walsh############################################################################### 69*7d68d00bSMichael Walshdef signal_handler(signal_number, 70*7d68d00bSMichael Walsh frame): 71*7d68d00bSMichael Walsh 72*7d68d00bSMichael Walsh r""" 73*7d68d00bSMichael Walsh Handle signals. Without a function to catch a SIGTERM or SIGINT, our 74*7d68d00bSMichael Walsh program would terminate immediately with return code 143 and without 75*7d68d00bSMichael Walsh calling our exit_function. 76*7d68d00bSMichael Walsh """ 77*7d68d00bSMichael Walsh 78*7d68d00bSMichael Walsh # Our convention is to set up exit_function with atexit.register() so 79*7d68d00bSMichael Walsh # there is no need to explicitly call exit_function from here. 80*7d68d00bSMichael Walsh 81*7d68d00bSMichael Walsh dprint_executing() 82*7d68d00bSMichael Walsh 83*7d68d00bSMichael Walsh # Calling exit prevents us from returning to the code that was running 84*7d68d00bSMichael Walsh # when we received the signal. 85*7d68d00bSMichael Walsh exit(0) 86*7d68d00bSMichael Walsh 87*7d68d00bSMichael Walsh############################################################################### 88*7d68d00bSMichael Walsh 89*7d68d00bSMichael Walsh 90*7d68d00bSMichael Walsh############################################################################### 91*7d68d00bSMichael Walshdef validate_parms(): 92*7d68d00bSMichael Walsh 93*7d68d00bSMichael Walsh r""" 94*7d68d00bSMichael Walsh Validate program parameters, etc. Return True or False (i.e. pass/fail) 95*7d68d00bSMichael Walsh accordingly. 96*7d68d00bSMichael Walsh """ 97*7d68d00bSMichael Walsh 98*7d68d00bSMichael Walsh # Your validation code here. 99*7d68d00bSMichael Walsh 100*7d68d00bSMichael Walsh gen_post_validation(exit_function, signal_handler) 101*7d68d00bSMichael Walsh 102*7d68d00bSMichael Walsh return True 103*7d68d00bSMichael Walsh 104*7d68d00bSMichael Walsh############################################################################### 105*7d68d00bSMichael Walsh 106*7d68d00bSMichael Walsh 107*7d68d00bSMichael Walsh############################################################################### 108*7d68d00bSMichael Walshdef main(): 109*7d68d00bSMichael Walsh 110*7d68d00bSMichael Walsh r""" 111*7d68d00bSMichael Walsh This is the "main" function. The advantage of having this function vs 112*7d68d00bSMichael Walsh just doing this in the true mainline is that you can: 113*7d68d00bSMichael Walsh - Declare local variables 114*7d68d00bSMichael Walsh - Use "return" instead of "exit". 115*7d68d00bSMichael Walsh - Indent 4 chars like you would in any function. 116*7d68d00bSMichael Walsh This makes coding more consistent, i.e. it's easy to move code from here 117*7d68d00bSMichael Walsh into a function and vice versa. 118*7d68d00bSMichael Walsh """ 119*7d68d00bSMichael Walsh 120*7d68d00bSMichael Walsh if not gen_get_options(parser, stock_list): 121*7d68d00bSMichael Walsh return False 122*7d68d00bSMichael Walsh 123*7d68d00bSMichael Walsh if not validate_parms(): 124*7d68d00bSMichael Walsh return False 125*7d68d00bSMichael Walsh 126*7d68d00bSMichael Walsh qprint_pgm_header() 127*7d68d00bSMichael Walsh 128*7d68d00bSMichael Walsh # Your code here. 129*7d68d00bSMichael Walsh 130*7d68d00bSMichael Walsh return True 131*7d68d00bSMichael Walsh 132*7d68d00bSMichael Walsh############################################################################### 133*7d68d00bSMichael Walsh 134*7d68d00bSMichael Walsh 135*7d68d00bSMichael Walsh############################################################################### 136*7d68d00bSMichael Walsh# Main 137*7d68d00bSMichael Walsh 138*7d68d00bSMichael Walshif not main(): 139*7d68d00bSMichael Walsh exit(1) 140*7d68d00bSMichael Walsh 141*7d68d00bSMichael Walsh############################################################################### 142