| # module getopt -- Standard command line processing. |
| |
| # Function getopt.getopt() has a different interface but provides the |
| # same functionality as the Unix getopt() function. |
| |
| # It has two arguments: the first should be argv[1:] (it doesn't want |
| # the script name), the second the string of option letters as passed |
| # to Unix getopt() (i.e., a string of allowable option letters, with |
| # options requiring an argument followed by a colon). |
| |
| # It raises the exception getopt.error with a string argument if it |
| # detects an error. |
| |
| # It returns two items: |
| # (1) a list of pairs (option, option_argument) giving the options in |
| # the order in which they were specified. (I'd use a dictionary |
| # but applications may depend on option order or multiple |
| # occurrences.) Boolean options have '' as option_argument. |
| # (2) the list of remaining arguments (may be empty). |
| |
| # Added by Lars Wirzenius (liw@iki.fi): A third argument is optional. |
| # If present, getopt.getopt works similar to the GNU getopt_long |
| # function (but optional arguments are not supported). The third |
| # argument should be a list of strings that name the long options. If |
| # the name ends '=', the argument requires an argument. |
| |
| # (While making this addition, I rewrote the whole thing.) |
| |
| import string |
| |
| error = 'getopt error' |
| |
| def getopt(args, shortopts, longopts = []): |
| list = [] |
| longopts = longopts[:] |
| longopts.sort() |
| while args and args[0][:1] == '-' and args[0] != '-': |
| if args[0] == '-' or args[0] == '--': |
| args = args[1:] |
| break |
| if args[0][:2] == '--': |
| list, args = do_longs(list, args[0][2:], |
| longopts, args[1:]) |
| else: |
| list, args = do_shorts(list, args[0][1:], |
| shortopts, args[1:]) |
| |
| return list, args |
| |
| def do_longs(list, opt, longopts, args): |
| try: |
| i = string.index(opt, '=') |
| opt, optarg = opt[:i], opt[i+1:] |
| except ValueError: |
| optarg = '' |
| |
| has_arg, opt = long_has_args(opt, longopts) |
| if has_arg: |
| if not optarg: |
| if not args: |
| raise error, 'option --' + opt + \ |
| ' requires argument' |
| optarg, args = args[0], args[1:] |
| else: |
| if optarg: |
| raise error, 'argument --' + opt + \ |
| ' must not have an argument' |
| list.append('--' + opt, optarg) |
| return list, args |
| |
| # Return: |
| # has_arg? |
| # full option name |
| def long_has_args(opt, longopts): |
| optlen = len(opt) |
| for i in range(len(longopts)): |
| x, y = longopts[i][:optlen], longopts[i][optlen:] |
| if opt != x: |
| continue |
| if y != '' and y != '=' and i+1 < len(longopts): |
| if opt == longopts[i+1][:optlen]: |
| raise error, 'option --' + opt + \ |
| ' not a unique prefix' |
| if longopts[i][-1:] == '=': |
| return 1, longopts[i][:-1] |
| return 0, longopts[i] |
| raise error, 'option --' + opt + ' not recognized' |
| |
| def do_shorts(list, optstring, shortopts, args): |
| while optstring != '': |
| opt, optstring = optstring[0], optstring[1:] |
| if short_has_arg(opt, shortopts): |
| if optstring == '': |
| if not args: |
| raise error, 'option -' + opt + \ |
| ' requires argument' |
| optstring, args = args[0], args[1:] |
| optarg, optstring = optstring, '' |
| else: |
| optarg = '' |
| list.append('-' + opt, optarg) |
| return list, args |
| |
| def short_has_arg(opt, shortopts): |
| for i in range(len(shortopts)): |
| if opt == shortopts[i] != ':': |
| return shortopts[i+1:i+2] == ':' |
| raise error, 'option -' + opt + ' not recognized' |
| |
| if __name__ == '__main__': |
| import sys |
| print getopt(sys.argv[1:], "a:b") |