| # module getopt -- Standard command line processing. | 
 |  | 
 | # Function getopt.getopt() has a different interface but provides the | 
 | # similar functionality to the Unix getopt() function, with the | 
 | # addition of long-option support.  (Long option support added by Lars | 
 | # Wirzenius <liw@iki.fi>.) | 
 |  | 
 | # It has two required arguments: the first should be argv[1:] (it | 
 | # doesn't want the script name), the second the string of option | 
 | # letters as passed to Unix getopt() (i.e., a string of allowable | 
 | # option letters, with options requiring an argument followed by a | 
 | # colon). | 
 |  | 
 | # The optional third argument, if present, getopt.getopt works similar | 
 | # to the GNU getopt_long function (but optional arguments are not | 
 | # supported).  The third argument should be a list of strings that | 
 | # name the long options.  If the name ends '=', the argument requires | 
 | # an argument. | 
 |  | 
 | # It raises the exception getopt.error with a string argument if it | 
 | # detects an error. | 
 |  | 
 | # It returns two values: | 
 | # (1)	a list of pairs (option, option_argument) giving the options in | 
 | #	the order in which they were specified.  (I'd use a dictionary | 
 | #	but applications may depend on option order or multiple | 
 | #	occurrences.)  Boolean options have '' as option_argument. | 
 | # (2)	the list of remaining arguments (may be empty). | 
 |  | 
 | import string | 
 |  | 
 | error = 'getopt.error' | 
 |  | 
 | def getopt(args, shortopts, longopts = []): | 
 |     list = [] | 
 |     longopts = longopts[:] | 
 |     longopts.sort() | 
 |     while args and args[0][:1] == '-' and args[0] != '-': | 
 | 	if args[0] == '--': | 
 | 	    args = args[1:] | 
 | 	    break | 
 | 	if args[0][:2] == '--': | 
 | 	    list, args = do_longs(list, args[0][2:], longopts, args[1:]) | 
 | 	else: | 
 | 	    list, args = do_shorts(list, args[0][1:], shortopts, args[1:]) | 
 |  | 
 |     return list, args | 
 |  | 
 | def do_longs(list, opt, longopts, args): | 
 |     try: | 
 | 	i = string.index(opt, '=') | 
 | 	opt, optarg = opt[:i], opt[i+1:] | 
 |     except ValueError: | 
 | 	optarg = None | 
 |  | 
 |     has_arg, opt = long_has_args(opt, longopts) | 
 |     if has_arg: | 
 | 	if optarg is None: | 
 | 	    if not args: | 
 | 		raise error, 'option --%s requires argument' % opt | 
 | 	    optarg, args = args[0], args[1:] | 
 |     elif optarg: | 
 | 	raise error, 'option --%s must not have an argument' % opt | 
 |     list.append(('--' + opt, optarg or '')) | 
 |     return list, args | 
 |  | 
 | # Return: | 
 | #   has_arg? | 
 | #   full option name | 
 | def long_has_args(opt, longopts): | 
 |     optlen = len(opt) | 
 |     for i in range(len(longopts)): | 
 | 	x, y = longopts[i][:optlen], longopts[i][optlen:] | 
 | 	if opt != x: | 
 | 	    continue | 
 | 	if y != '' and y != '=' and i+1 < len(longopts): | 
 | 	    if opt == longopts[i+1][:optlen]: | 
 | 		raise error, 'option --%s not a unique prefix' % opt | 
 | 	if longopts[i][-1:] in ('=', ): | 
 | 	    return 1, longopts[i][:-1] | 
 | 	return 0, longopts[i] | 
 |     raise error, 'option --' + opt + ' not recognized' | 
 |  | 
 | def do_shorts(list, optstring, shortopts, args): | 
 |     while optstring != '': | 
 | 	opt, optstring = optstring[0], optstring[1:] | 
 | 	if short_has_arg(opt, shortopts): | 
 | 	    if optstring == '': | 
 | 		if not args: | 
 | 		    raise error, 'option -%s requires argument' % opt | 
 | 		optstring, args = args[0], args[1:] | 
 | 	    optarg, optstring = optstring, '' | 
 | 	else: | 
 | 	    optarg = '' | 
 | 	list.append(('-' + opt, optarg)) | 
 |     return list, args | 
 |  | 
 | def short_has_arg(opt, shortopts): | 
 |     for i in range(len(shortopts)): | 
 | 	if opt == shortopts[i] != ':': | 
 | 	    return shortopts[i+1:i+2] == ':' | 
 |     raise error, 'option -%s not recognized' % opt | 
 |  | 
 | if __name__ == '__main__': | 
 |     import sys | 
 |     print getopt(sys.argv[1:], "a:b", ["alpha=", "beta"]) |