Statistics
| Revision:

root / tags / v1_0_2_Build_912 / extensions / extScripting / scripts / jython / Lib / getopt.py @ 11422

History | View | Annotate | Download (5.06 KB)

1
"""Parser for command line options.
2

3
This module helps scripts to parse the command line arguments in
4
sys.argv.  It supports the same conventions as the Unix getopt()
5
function (including the special meanings of arguments of the form `-'
6
and `--').  Long options similar to those supported by GNU software
7
may be used as well via an optional third argument.  This module
8
provides a single function and an exception:
9

10
getopt() -- Parse command line options
11
GetoptError -- exception (class) raised with 'opt' attribute, which is the
12
option involved with the exception.
13
"""
14

    
15
# Long option support added by Lars Wirzenius <liw@iki.fi>.
16

    
17
# Gerrit Holl <gerrit@nl.linux.org> moved the string-based exceptions
18
# to class-based exceptions.
19

    
20
__all__ = ["GetoptError","error","getopt"]
21

    
22
class GetoptError(Exception):
23
    opt = ''
24
    msg = ''
25
    def __init__(self, msg, opt):
26
        self.msg = msg
27
        self.opt = opt
28
        Exception.__init__(self, msg, opt)
29

    
30
    def __str__(self):
31
        return self.msg
32

    
33
error = GetoptError # backward compatibility
34

    
35
def getopt(args, shortopts, longopts = []):
36
    """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)
67
    while args and args[0].startswith('-') and args[0] != '-':
68
        if args[0] == '--':
69
            args = args[1:]
70
            break
71
        if args[0][:2] == '--':
72
            opts, args = do_longs(opts, args[0][2:], longopts, args[1:])
73
        else:
74
            opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
75

    
76
    return opts, args
77

    
78
def do_longs(opts, opt, longopts, args):
79
    try:
80
        i = opt.index('=')
81
    except ValueError:
82
        optarg = None
83
    else:
84
        opt, optarg = opt[:i], opt[i+1:]
85

    
86
    has_arg, opt = long_has_args(opt, longopts)
87
    if has_arg:
88
        if optarg is None:
89
            if not args:
90
                raise GetoptError('option --%s requires argument' % opt, opt)
91
            optarg, args = args[0], args[1:]
92
    elif optarg:
93
        raise GetoptError('option --%s must not have an argument' % opt, opt)
94
    opts.append(('--' + opt, optarg or ''))
95
    return opts, args
96

    
97
# Return:
98
#   has_arg?
99
#   full option name
100
def long_has_args(opt, longopts):
101
    possibilities = [o for o in longopts if o.startswith(opt)]
102
    if not possibilities:
103
        raise GetoptError('option --%s not recognized' % opt, opt)
104
    # 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
120

    
121
def do_shorts(opts, optstring, shortopts, args):
122
    while optstring != '':
123
        opt, optstring = optstring[0], optstring[1:]
124
        if short_has_arg(opt, shortopts):
125
            if optstring == '':
126
                if not args:
127
                    raise GetoptError('option -%s requires argument' % opt, opt)
128
                optstring, args = args[0], args[1:]
129
            optarg, optstring = optstring, ''
130
        else:
131
            optarg = ''
132
        opts.append(('-' + opt, optarg))
133
    return opts, args
134

    
135
def short_has_arg(opt, shortopts):
136
    for i in range(len(shortopts)):
137
        if opt == shortopts[i] != ':':
138
            return shortopts[i+1:i+2] == ':'
139
    raise GetoptError('option -%s not recognized' % opt, opt)
140

    
141
if __name__ == '__main__':
142
    import sys
143
    print getopt(sys.argv[1:], "a:b", ["alpha=", "beta"])