blob: 821ea6b6a84da47e137a0d50ad408df9a3f45b58 [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
4# same functionality as the Unix getopt() function.
5
6# It has two arguments: the first should be argv[1:] (it doesn't want
7# the script name), the second the string of option letters as passed
8# to Unix getopt() (i.e., a string of allowable option letters, with
9# options requiring an argument followed by a colon).
10
11# It raises the exception getopt.error with a string argument if it
12# detects an error.
13
14# It returns two items:
15# (1) a list of pairs (option, option_argument) giving the options in
16# the order in which they were specified. (I'd use a dictionary
17# but applications may depend on option order or multiple
18# occurrences.) Boolean options have '' as option_argument.
19# (2) the list of remaining arguments (may be empty).
20
Guido van Rossum2c349bb1996-09-09 15:48:24 +000021# Added by Lars Wirzenius (liw@iki.fi): A third argument is optional.
22# If present, getopt.getopt works similar to the GNU getopt_long
23# function (but optional arguments are not supported). The third
24# argument should be a list of strings that name the long options. If
25# the name ends '=', the argument requires an argument.
26
27# (While making this addition, I rewrote the whole thing.)
28
29import string
30
Guido van Rossumc6360141990-10-13 19:23:40 +000031error = 'getopt error'
32
Guido van Rossum2c349bb1996-09-09 15:48:24 +000033def getopt(args, shortopts, longopts = []):
34 list = []
35 longopts = longopts[:]
36 longopts.sort()
37 while args and args[0][:1] == '-' and args[0] != '-':
38 if args[0] == '-' or args[0] == '--':
39 args = args[1:]
40 break
41 if args[0][:2] == '--':
42 list, args = do_longs(list, args[0][2:],
43 longopts, args[1:])
44 else:
45 list, args = do_shorts(list, args[0][1:],
46 shortopts, args[1:])
Guido van Rossumc6360141990-10-13 19:23:40 +000047
Guido van Rossum2c349bb1996-09-09 15:48:24 +000048 return list, args
49
50def do_longs(list, opt, longopts, args):
51 try:
52 i = string.index(opt, '=')
53 opt, optarg = opt[:i], opt[i+1:]
54 except ValueError:
55 optarg = ''
56
57 has_arg, opt = long_has_args(opt, longopts)
58 if has_arg:
59 if not optarg:
60 if not args:
61 raise error, 'option --' + opt + \
62 ' requires argument'
63 optarg, args = args[0], args[1:]
64 else:
65 if optarg:
66 raise error, 'argument --' + opt + \
67 ' must not have an argument'
68 list.append('--' + opt, optarg)
69 return list, args
70
71# Return:
72# has_arg?
73# full option name
74def long_has_args(opt, longopts):
75 optlen = len(opt)
76 for i in range(len(longopts)):
77 x, y = longopts[i][:optlen], longopts[i][optlen:]
78 if opt != x:
79 continue
80 if y != '' and y != '=' and i+1 < len(longopts):
81 if opt == longopts[i+1][:optlen]:
82 raise error, 'option --' + opt + \
83 ' not a unique prefix'
84 if longopts[i][-1:] == '=':
85 return 1, longopts[i][:-1]
86 return 0, longopts[i]
87 raise error, 'option --' + opt + ' not recognized'
88
89def do_shorts(list, optstring, shortopts, args):
90 while optstring != '':
91 opt, optstring = optstring[0], optstring[1:]
92 if short_has_arg(opt, shortopts):
93 if optstring == '':
94 if not args:
95 raise error, 'option -' + opt + \
96 ' requires argument'
97 optstring, args = args[0], args[1:]
98 optarg, optstring = optstring, ''
99 else:
100 optarg = ''
101 list.append('-' + opt, optarg)
102 return list, args
103
104def short_has_arg(opt, shortopts):
105 for i in range(len(shortopts)):
106 if opt == shortopts[i] != ':':
107 return shortopts[i+1:i+2] == ':'
108 raise error, 'option -' + opt + ' not recognized'
109
110if __name__ == '__main__':
111 import sys
112 print getopt(sys.argv[1:], "a:b")