1 # module getopt -- Standard command line processing.
3 # Function getopt.getopt() has a different interface but provides the
4 # 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>.)
8 # 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
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
20 # It raises the exception getopt.error with a string argument if it
23 # It returns two values:
24 # (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).
32 error
= 'getopt.error'
34 def getopt(args
, shortopts
, longopts
= []):
36 longopts
= longopts
[:]
38 while args
and args
[0][:1] == '-' and args
[0] != '-':
42 if args
[0][:2] == '--':
43 list, args
= do_longs(list, args
[0][2:], longopts
, args
[1:])
45 list, args
= do_shorts(list, args
[0][1:], shortopts
, args
[1:])
49 def do_longs(list, opt
, longopts
, args
):
51 i
= string
.index(opt
, '=')
52 opt
, optarg
= opt
[:i
], opt
[i
+1:]
56 has_arg
, opt
= long_has_args(opt
, longopts
)
60 raise error
, 'option --%s requires argument' % opt
61 optarg
, args
= args
[0], args
[1:]
63 raise error
, 'option --%s must not have an argument' % opt
64 list.append(('--' + opt
, optarg
or ''))
70 def long_has_args(opt
, longopts
):
72 for i
in range(len(longopts
)):
73 x
, y
= longopts
[i
][:optlen
], longopts
[i
][optlen
:]
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]
82 raise error
, 'option --' + opt
+ ' not recognized'
84 def do_shorts(list, optstring
, shortopts
, args
):
85 while optstring
!= '':
86 opt
, optstring
= optstring
[0], optstring
[1:]
87 if short_has_arg(opt
, shortopts
):
90 raise error
, 'option -%s requires argument' % opt
91 optstring
, args
= args
[0], args
[1:]
92 optarg
, optstring
= optstring
, ''
95 list.append(('-' + opt
, optarg
))
98 def short_has_arg(opt
, shortopts
):
99 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
104 if __name__
== '__main__':
106 print getopt(sys
.argv
[1:], "a:b", ["alpha=", "beta"])