blob: 82cf04d76a253ddbe1936ec3fffd11501d815682 [file] [log] [blame]
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +00001"""Parser for command line options.
Guido van Rossumc6360141990-10-13 19:23:40 +00002
Guido van Rossum6d060941998-11-17 04:16:37 +00003This module helps scripts to parse the command line arguments in
4sys.argv. It supports the same conventions as the Unix getopt()
5function (including the special meanings of arguments of the form `-'
6and `--'). Long options similar to those supported by GNU software
7may be used as well via an optional third argument. This module
8provides a single function and an exception:
Guido van Rossumc6360141990-10-13 19:23:40 +00009
Guido van Rossum6d060941998-11-17 04:16:37 +000010getopt() -- Parse command line options
Guido van Rossum80c33e51999-12-21 22:38:40 +000011GetoptError -- exception (class) raised with 'opt' attribute, which is the
12option involved with the exception.
Guido van Rossum6d060941998-11-17 04:16:37 +000013"""
Guido van Rossum1550ff71996-09-11 19:43:52 +000014
Guido van Rossum6d060941998-11-17 04:16:37 +000015# Long option support added by Lars Wirzenius <liw@iki.fi>.
Guido van Rossumc6360141990-10-13 19:23:40 +000016
Fred Drakea395ced2000-02-25 16:14:08 +000017# Gerrit Holl <gerrit@nl.linux.org> moved the string-based exceptions
18# to class-based exceptions.
19
Skip Montanaroeccd02a2001-01-20 23:34:12 +000020__all__ = ["GetoptError","error","getopt"]
21
Guido van Rossum80c33e51999-12-21 22:38:40 +000022class GetoptError(Exception):
23 opt = ''
24 msg = ''
Fred Drakee1fd5262001-01-08 15:39:32 +000025 def __init__(self, msg, opt):
26 self.msg = msg
27 self.opt = opt
28 Exception.__init__(self, msg, opt)
Guido van Rossum80c33e51999-12-21 22:38:40 +000029
30 def __str__(self):
31 return self.msg
32
33error = GetoptError # backward compatibility
Guido van Rossumc6360141990-10-13 19:23:40 +000034
Guido van Rossum2c349bb1996-09-09 15:48:24 +000035def getopt(args, shortopts, longopts = []):
Guido van Rossum6d060941998-11-17 04:16:37 +000036 """getopt(args, options[, long_options]) -> opts, args
37
38 Parses command line options and parameter list. args is the
39 argument list to be parsed, without the leading reference to the
40 running program. Typically, this means "sys.argv[1:]". shortopts
41 is the string of option letters that the script wants to
42 recognize, with options that require an argument followed by a
43 colon (i.e., the same format that Unix getopt() uses). If
44 specified, longopts is a list of strings with the names of the
45 long options which should be supported. The leading '--'
46 characters should not be included in the option name. Options
47 which require an argument should be followed by an equal sign
48 ('=').
49
50 The return value consists of two elements: the first is a list of
51 (option, value) pairs; the second is the list of program arguments
52 left after the option list was stripped (this is a trailing slice
53 of the first argument). Each option-and-value pair returned has
54 the option as its first element, prefixed with a hyphen (e.g.,
55 '-x'), and the option argument as its second element, or an empty
56 string if the option has no argument. The options occur in the
57 list in the same order in which they were found, thus allowing
58 multiple occurrences. Long and short options may be mixed.
59
60 """
61
62 opts = []
63 if type(longopts) == type(""):
64 longopts = [longopts]
65 else:
66 longopts = list(longopts)
Tim Petersdd699b62000-12-27 08:05:05 +000067 while args and args[0].startswith('-') and args[0] != '-':
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000068 if args[0] == '--':
69 args = args[1:]
70 break
71 if args[0][:2] == '--':
Guido van Rossum6d060941998-11-17 04:16:37 +000072 opts, args = do_longs(opts, args[0][2:], longopts, args[1:])
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000073 else:
Guido van Rossum6d060941998-11-17 04:16:37 +000074 opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
Guido van Rossumc6360141990-10-13 19:23:40 +000075
Guido van Rossum6d060941998-11-17 04:16:37 +000076 return opts, args
Guido van Rossum2c349bb1996-09-09 15:48:24 +000077
Guido van Rossum6d060941998-11-17 04:16:37 +000078def do_longs(opts, opt, longopts, args):
Guido van Rossum1550ff71996-09-11 19:43:52 +000079 try:
Fred Drakea395ced2000-02-25 16:14:08 +000080 i = opt.index('=')
Guido van Rossum1550ff71996-09-11 19:43:52 +000081 except ValueError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000082 optarg = None
Tim Petersdd699b62000-12-27 08:05:05 +000083 else:
84 opt, optarg = opt[:i], opt[i+1:]
Guido van Rossum2c349bb1996-09-09 15:48:24 +000085
Guido van Rossum1550ff71996-09-11 19:43:52 +000086 has_arg, opt = long_has_args(opt, longopts)
87 if has_arg:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000088 if optarg is None:
89 if not args:
Guido van Rossum80c33e51999-12-21 22:38:40 +000090 raise GetoptError('option --%s requires argument' % opt, opt)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000091 optarg, args = args[0], args[1:]
Guido van Rossum1550ff71996-09-11 19:43:52 +000092 elif optarg:
Guido van Rossum80c33e51999-12-21 22:38:40 +000093 raise GetoptError('option --%s must not have an argument' % opt, opt)
Guido van Rossum6d060941998-11-17 04:16:37 +000094 opts.append(('--' + opt, optarg or ''))
95 return opts, args
Guido van Rossum2c349bb1996-09-09 15:48:24 +000096
97# Return:
98# has_arg?
99# full option name
100def long_has_args(opt, longopts):
Tim Petersd31b6322000-12-29 02:17:56 +0000101 possibilities = [o for o in longopts if o.startswith(opt)]
102 if not possibilities:
Tim Petersdd699b62000-12-27 08:05:05 +0000103 raise GetoptError('option --%s not recognized' % opt, opt)
Tim Petersdd699b62000-12-27 08:05:05 +0000104 # Is there an exact match?
105 if opt in possibilities:
106 return 0, opt
107 elif opt + '=' in possibilities:
108 return 1, opt
109 # No exact match, so better be unique.
110 if len(possibilities) > 1:
111 # XXX since possibilities contains all valid continuations, might be
112 # nice to work them into the error msg
113 raise GetoptError('option --%s not a unique prefix' % opt, opt)
114 assert len(possibilities) == 1
115 unique_match = possibilities[0]
116 has_arg = unique_match.endswith('=')
117 if has_arg:
118 unique_match = unique_match[:-1]
119 return has_arg, unique_match
Guido van Rossum2c349bb1996-09-09 15:48:24 +0000120
Guido van Rossum6d060941998-11-17 04:16:37 +0000121def do_shorts(opts, optstring, shortopts, args):
Guido van Rossum1550ff71996-09-11 19:43:52 +0000122 while optstring != '':
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000123 opt, optstring = optstring[0], optstring[1:]
124 if short_has_arg(opt, shortopts):
125 if optstring == '':
126 if not args:
Guido van Rossum80c33e51999-12-21 22:38:40 +0000127 raise GetoptError('option -%s requires argument' % opt, opt)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000128 optstring, args = args[0], args[1:]
129 optarg, optstring = optstring, ''
130 else:
131 optarg = ''
Guido van Rossum6d060941998-11-17 04:16:37 +0000132 opts.append(('-' + opt, optarg))
133 return opts, args
Guido van Rossum2c349bb1996-09-09 15:48:24 +0000134
135def short_has_arg(opt, shortopts):
Guido van Rossum1550ff71996-09-11 19:43:52 +0000136 for i in range(len(shortopts)):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000137 if opt == shortopts[i] != ':':
138 return shortopts[i+1:i+2] == ':'
Guido van Rossum80c33e51999-12-21 22:38:40 +0000139 raise GetoptError('option -%s not recognized' % opt, opt)
Guido van Rossum2c349bb1996-09-09 15:48:24 +0000140
141if __name__ == '__main__':
Guido van Rossum1550ff71996-09-11 19:43:52 +0000142 import sys
143 print getopt(sys.argv[1:], "a:b", ["alpha=", "beta"])