blob: 5d71b282546794eee14466e9d362e0df8522a456 [file] [log] [blame]
Guido van Rossumc6360141990-10-13 19:23:40 +00001# module getopt -- Standard command line processing.
2
3# Function getopt.getopt() has a different interface but provides the
Guido van Rossum1550ff71996-09-11 19:43:52 +00004# similar functionality to the Unix getopt() function, with the
5# addition of long-option support. (Long option support added by Lars
6# Wirzenius <liw@iki.fi>.)
Guido van Rossumc6360141990-10-13 19:23:40 +00007
Guido van Rossum1550ff71996-09-11 19:43:52 +00008# It has two required arguments: the first should be argv[1:] (it
9# doesn't want the script name), the second the string of option
10# letters as passed to Unix getopt() (i.e., a string of allowable
11# option letters, with options requiring an argument followed by a
12# colon).
13
14# The optional third argument, if present, getopt.getopt works similar
15# to the GNU getopt_long function (but optional arguments are not
16# supported). The third argument should be a list of strings that
17# name the long options. If the name ends '=', the argument requires
18# an argument.
Guido van Rossumc6360141990-10-13 19:23:40 +000019
20# It raises the exception getopt.error with a string argument if it
21# detects an error.
22
Guido van Rossum1550ff71996-09-11 19:43:52 +000023# It returns two values:
Guido van Rossumc6360141990-10-13 19:23:40 +000024# (1) a list of pairs (option, option_argument) giving the options in
25# the order in which they were specified. (I'd use a dictionary
26# but applications may depend on option order or multiple
27# occurrences.) Boolean options have '' as option_argument.
28# (2) the list of remaining arguments (may be empty).
29
Guido van Rossum2c349bb1996-09-09 15:48:24 +000030import string
31
Guido van Rossum1550ff71996-09-11 19:43:52 +000032error = 'getopt.error'
Guido van Rossumc6360141990-10-13 19:23:40 +000033
Guido van Rossum2c349bb1996-09-09 15:48:24 +000034def getopt(args, shortopts, longopts = []):
Guido van Rossum1550ff71996-09-11 19:43:52 +000035 list = []
36 longopts = longopts[:]
37 longopts.sort()
38 while args and args[0][:1] == '-' and args[0] != '-':
39 if args[0] == '--':
40 args = args[1:]
41 break
42 if args[0][:2] == '--':
43 list, args = do_longs(list, args[0][2:], longopts, args[1:])
44 else:
45 list, args = do_shorts(list, args[0][1:], shortopts, args[1:])
Guido van Rossumc6360141990-10-13 19:23:40 +000046
Guido van Rossum1550ff71996-09-11 19:43:52 +000047 return list, args
Guido van Rossum2c349bb1996-09-09 15:48:24 +000048
49def do_longs(list, opt, longopts, args):
Guido van Rossum1550ff71996-09-11 19:43:52 +000050 try:
51 i = string.index(opt, '=')
52 opt, optarg = opt[:i], opt[i+1:]
53 except ValueError:
54 optarg = None
Guido van Rossum2c349bb1996-09-09 15:48:24 +000055
Guido van Rossum1550ff71996-09-11 19:43:52 +000056 has_arg, opt = long_has_args(opt, longopts)
57 if has_arg:
58 if optarg is None:
59 if not args:
60 raise error, 'option --%s requires argument' % opt
61 optarg, args = args[0], args[1:]
62 elif optarg:
63 raise error, 'option --%s must not have an argument' % opt
64 list.append(('--' + opt, optarg or ''))
65 return list, args
Guido van Rossum2c349bb1996-09-09 15:48:24 +000066
67# Return:
68# has_arg?
69# full option name
70def long_has_args(opt, longopts):
Guido van Rossum1550ff71996-09-11 19:43:52 +000071 optlen = len(opt)
72 for i in range(len(longopts)):
73 x, y = longopts[i][:optlen], longopts[i][optlen:]
74 if opt != x:
75 continue
76 if y != '' and y != '=' and i+1 < len(longopts):
77 if opt == longopts[i+1][:optlen]:
78 raise error, 'option --%s not a unique prefix' % opt
79 if longopts[i][-1:] in ('=', ):
80 return 1, longopts[i][:-1]
81 return 0, longopts[i]
82 raise error, 'option --' + opt + ' not recognized'
Guido van Rossum2c349bb1996-09-09 15:48:24 +000083
84def do_shorts(list, optstring, shortopts, args):
Guido van Rossum1550ff71996-09-11 19:43:52 +000085 while optstring != '':
86 opt, optstring = optstring[0], optstring[1:]
87 if short_has_arg(opt, shortopts):
88 if optstring == '':
89 if not args:
90 raise error, 'option -%s requires argument' % opt
91 optstring, args = args[0], args[1:]
92 optarg, optstring = optstring, ''
93 else:
94 optarg = ''
95 list.append(('-' + opt, optarg))
96 return list, args
Guido van Rossum2c349bb1996-09-09 15:48:24 +000097
98def short_has_arg(opt, shortopts):
Guido van Rossum1550ff71996-09-11 19:43:52 +000099 for i in range(len(shortopts)):
100 if opt == shortopts[i] != ':':
101 return shortopts[i+1:i+2] == ':'
102 raise error, 'option -%s not recognized' % opt
Guido van Rossum2c349bb1996-09-09 15:48:24 +0000103
104if __name__ == '__main__':
Guido van Rossum1550ff71996-09-11 19:43:52 +0000105 import sys
106 print getopt(sys.argv[1:], "a:b", ["alpha=", "beta"])