kj wrote: > I'd written a Perl module to facilitate the writing of scripts. > It contained all my boilerplate code for parsing and validating > command-line options, generating of accessor functions for these > options, printing of the help message and of the full documentation, > testing, etc.
A lot of people seem to have gotten hung up on this paragraph. kj remarks in one reply that he *does* use optparse, but there still seems to be much confusion. I've long done something similar, so I'll attempt to clarify. For most of the programming languages that I use, my first exercise is to write a program that accepts a 'getopt' string and creates a program around it. Here's a simple version that I just whipped out; the version that I commonly use is a bit more complicated. """%s [-h] [optionstring] The program generates boilerplate for a Python script. It accepts a single argument consisting of a string of option letters that you wish the script to recognize, with options that require an argument followed by a colon (i.e., the same format that Unix getopt() uses). Written by samwyse Created on Feb 02, 2008 """ import sys import getopt class UserError(Exception): def __init__(self, msg): self.msg = msg class Usage(UserError): pass def main(argv=None): if argv is None: argv = sys.argv # parse command line options try: try: opts, args = getopt.getopt(argv[1:], "h") except getopt.error, msg: raise Usage(msg) # process options for o, a in opts: if o == '-h': print __doc__ % argv[0] return 0 except UserError, err: print >>sys.stderr, err.msg print >>sys.stderr, "for help use --help" if type(err) is Usage: return 2 else: return 1 # process arguments for arg in args: # process() is defined elsewhere process(arg) #----#----#----#----#----#----# def process(shortopts): from time import strftime prolog = '''\ """Module docstring. This serves as a long usage message. Written by %(author)s Created on %(date)s """ import sys import getopt class UserError(Exception): def __init__(self, msg): self.msg = msg class Usage(UserError): pass def main(argv=None): if argv is None: argv = sys.argv # parse command line options try: try: opts, args = getopt.getopt(argv[1:], "%(opts)s") except getopt.error, msg: raise Usage(msg) # process options for o, a in opts:''' has_arg = '''\ if o == '-%(opt)s': opt_%(opt)s = a''' no_arg = '''\ if o == '-%(opt)s': opt_%(opt)s = True''' epilog = '''\ except UserError, err: print >>sys.stderr, err.msg print >>sys.stderr, "for help use --help" if type(err) is Usage: return 2 else: return 1 # process arguments for arg in args: # process() is defined elsewhere process(arg) if __name__ == "__main__": sys.exit(main()) ''' values = { 'date': strftime('%b %d, %Y'), 'author': 'samwyse', 'opts': shortopts } print prolog % values for i in range(len(shortopts)): c = shortopts[i] if c != ':': if shortopts.startswith(':', i+1): print has_arg % { 'opt': c } else: print no_arg % { 'opt': c } print epilog % values #----#----#----#----#----#----# if __name__ == "__main__": sys.exit(main()) -- http://mail.python.org/mailman/listinfo/python-list