mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			106 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # 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"])
 | 
